@elizaos/plugin-xai 2.0.0-alpha.6 → 2.0.3-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +43 -21
  3. package/auto-enable.ts +17 -0
  4. package/package.json +44 -102
  5. package/registry-entry.json +75 -0
  6. package/dist/actions/post.d.ts +0 -3
  7. package/dist/actions/post.d.ts.map +0 -1
  8. package/dist/base.d.ts +0 -55
  9. package/dist/base.d.ts.map +0 -1
  10. package/dist/browser/index.browser.js +0 -4
  11. package/dist/browser/index.browser.js.map +0 -11
  12. package/dist/browser/index.d.ts +0 -2
  13. package/dist/cjs/index.d.ts +0 -2
  14. package/dist/cjs/index.node.cjs +0 -11197
  15. package/dist/cjs/index.node.js.map +0 -116
  16. package/dist/client/api-types.d.ts +0 -28
  17. package/dist/client/api-types.d.ts.map +0 -1
  18. package/dist/client/auth-providers/broker.d.ts +0 -19
  19. package/dist/client/auth-providers/broker.d.ts.map +0 -1
  20. package/dist/client/auth-providers/env.d.ts +0 -20
  21. package/dist/client/auth-providers/env.d.ts.map +0 -1
  22. package/dist/client/auth-providers/factory.d.ts +0 -5
  23. package/dist/client/auth-providers/factory.d.ts.map +0 -1
  24. package/dist/client/auth-providers/interactive.d.ts +0 -7
  25. package/dist/client/auth-providers/interactive.d.ts.map +0 -1
  26. package/dist/client/auth-providers/oauth2-pkce.d.ts +0 -24
  27. package/dist/client/auth-providers/oauth2-pkce.d.ts.map +0 -1
  28. package/dist/client/auth-providers/pkce.d.ts +0 -5
  29. package/dist/client/auth-providers/pkce.d.ts.map +0 -1
  30. package/dist/client/auth-providers/token-store.d.ts +0 -31
  31. package/dist/client/auth-providers/token-store.d.ts.map +0 -1
  32. package/dist/client/auth-providers/types.d.ts +0 -35
  33. package/dist/client/auth-providers/types.d.ts.map +0 -1
  34. package/dist/client/auth.d.ts +0 -38
  35. package/dist/client/auth.d.ts.map +0 -1
  36. package/dist/client/client.d.ts +0 -462
  37. package/dist/client/client.d.ts.map +0 -1
  38. package/dist/client/errors.d.ts +0 -72
  39. package/dist/client/errors.d.ts.map +0 -1
  40. package/dist/client/index.d.ts +0 -21
  41. package/dist/client/index.d.ts.map +0 -1
  42. package/dist/client/posts.d.ts +0 -325
  43. package/dist/client/posts.d.ts.map +0 -1
  44. package/dist/client/profile.d.ts +0 -140
  45. package/dist/client/profile.d.ts.map +0 -1
  46. package/dist/client/relationships.d.ts +0 -47
  47. package/dist/client/relationships.d.ts.map +0 -1
  48. package/dist/client/search.d.ts +0 -48
  49. package/dist/client/search.d.ts.map +0 -1
  50. package/dist/client/types.d.ts +0 -24
  51. package/dist/client/types.d.ts.map +0 -1
  52. package/dist/constants.d.ts +0 -5
  53. package/dist/constants.d.ts.map +0 -1
  54. package/dist/discovery.d.ts +0 -37
  55. package/dist/discovery.d.ts.map +0 -1
  56. package/dist/environment.d.ts +0 -40
  57. package/dist/environment.d.ts.map +0 -1
  58. package/dist/generated/prompts/typescript/prompts.d.ts +0 -22
  59. package/dist/generated/prompts/typescript/prompts.d.ts.map +0 -1
  60. package/dist/generated/specs/spec-helpers.d.ts +0 -49
  61. package/dist/generated/specs/spec-helpers.d.ts.map +0 -1
  62. package/dist/generated/specs/specs.d.ts +0 -65
  63. package/dist/generated/specs/specs.d.ts.map +0 -1
  64. package/dist/index.browser.d.ts +0 -6
  65. package/dist/index.browser.d.ts.map +0 -1
  66. package/dist/index.d.ts +0 -5
  67. package/dist/index.d.ts.map +0 -1
  68. package/dist/index.node.d.ts +0 -3
  69. package/dist/index.node.d.ts.map +0 -1
  70. package/dist/interactions.d.ts +0 -129
  71. package/dist/interactions.d.ts.map +0 -1
  72. package/dist/models/grok.d.ts +0 -7
  73. package/dist/models/grok.d.ts.map +0 -1
  74. package/dist/node/index.d.ts +0 -2
  75. package/dist/node/index.node.js +0 -11212
  76. package/dist/node/index.node.js.map +0 -116
  77. package/dist/post.d.ts +0 -43
  78. package/dist/post.d.ts.map +0 -1
  79. package/dist/services/x.service.d.ts +0 -23
  80. package/dist/services/x.service.d.ts.map +0 -1
  81. package/dist/templates.d.ts +0 -6
  82. package/dist/templates.d.ts.map +0 -1
  83. package/dist/timeline.d.ts +0 -46
  84. package/dist/timeline.d.ts.map +0 -1
  85. package/dist/types.d.ts +0 -150
  86. package/dist/types.d.ts.map +0 -1
  87. package/dist/utils/error-handler.d.ts +0 -20
  88. package/dist/utils/error-handler.d.ts.map +0 -1
  89. package/dist/utils/memory.d.ts +0 -21
  90. package/dist/utils/memory.d.ts.map +0 -1
  91. package/dist/utils/settings.d.ts +0 -3
  92. package/dist/utils/settings.d.ts.map +0 -1
  93. package/dist/utils/time.d.ts +0 -2
  94. package/dist/utils/time.d.ts.map +0 -1
  95. package/dist/utils.d.ts +0 -36
  96. package/dist/utils.d.ts.map +0 -1
@@ -1,116 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/globals.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/TwitterPaginator.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/paginator.v1.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/dm.paginator.v1.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v1/streaming.v1.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v1/tweet.v1.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v1/entities.v1.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v1/user.v1.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v1/dev-utilities.v1.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v1/geo.v1.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v1/trends.v1.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v1/dm.v1.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v1/list.v1.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v1/index.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v2/streaming.v2.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v2/tweet.v2.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v2/tweet.definition.v2.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v2/user.v2.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v2/spaces.v2.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v2/list.v2.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v2/community.v2.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/v2/index.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/errors.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/responses.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/client.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/auth.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/plugins/client.plugins.types.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/plugins/index.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/types/index.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/settings.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/helpers.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client-mixins/request-handler.helper.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/stream/TweetStreamEventCombiner.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/stream/TweetStreamParser.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/stream/TweetStream.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/plugins/helpers.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client-mixins/oauth1.helper.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client-mixins/form-data.helper.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client-mixins/request-param.helper.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client-mixins/oauth2.helper.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client-mixins/request-maker.mixin.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client.base.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client.subclient.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/tweet.paginator.v1.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/mutes.paginator.v1.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/followers.paginator.v1.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/friends.paginator.v1.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/user.paginator.v1.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/list.paginator.v1.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v1/client.v1.read.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v1/media-helpers.v1.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v1/client.v1.write.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v1/client.v1.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v2/includes.v2.helper.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/v2.paginator.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/tweet.paginator.v2.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/user.paginator.v2.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/list.paginator.v2.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/index.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v2-labs/client.v2.labs.read.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/paginators/dm.paginator.v2.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v2/client.v2.read.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v2-labs/client.v2.labs.write.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v2/client.v2.write.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v2-labs/client.v2.labs.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/v2/client.v2.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client/readonly.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client/readwrite.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/ads/client.ads.read.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/ads/client.ads.write.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/ads-sandbox/client.ads-sandbox.read.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/ads-sandbox/client.ads-sandbox.write.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/ads-sandbox/client.ads-sandbox.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/ads/client.ads.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/client/index.js", "../../../../../node_modules/.pnpm/twitter-api-v2@1.29.0/node_modules/twitter-api-v2/dist/cjs/index.js", "../../index.ts", "../../actions/post.ts", "../../generated/specs/specs.ts", "../../generated/specs/spec-helpers.ts", "../../utils.ts", "../../constants.ts", "../../models/grok.ts", "../../services/x.service.ts", "../../base.ts", "../../utils/settings.ts", "../../client/auth-providers/broker.ts", "../../client/auth-providers/env.ts", "../../client/auth-providers/oauth2-pkce.ts", "../../client/auth-providers/interactive.ts", "../../client/auth-providers/pkce.ts", "../../client/auth-providers/token-store.ts", "../../client/auth-providers/factory.ts", "../../client/auth.ts", "../../client/profile.ts", "../../client/posts.ts", "../../client/relationships.ts", "../../client/search.ts", "../../client/client.ts", "../../utils/memory.ts", "../../utils/time.ts", "../../discovery.ts", "../../environment.ts", "../../interactions.ts", "../../generated/prompts/typescript/prompts.ts", "../../post.ts", "../../timeline.ts"],
4
- "sourcesContent": [
5
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.API_ADS_SANDBOX_PREFIX = exports.API_ADS_PREFIX = exports.API_V1_1_STREAM_PREFIX = exports.API_V1_1_UPLOAD_PREFIX = exports.API_V1_1_PREFIX = exports.API_V2_LABS_PREFIX = exports.API_V2_PREFIX = void 0;\nexports.API_V2_PREFIX = 'https://api.x.com/2/';\nexports.API_V2_LABS_PREFIX = 'https://api.x.com/labs/2/';\nexports.API_V1_1_PREFIX = 'https://api.x.com/1.1/';\nexports.API_V1_1_UPLOAD_PREFIX = 'https://upload.x.com/1.1/';\nexports.API_V1_1_STREAM_PREFIX = 'https://stream.x.com/1.1/';\nexports.API_ADS_PREFIX = 'https://ads-api.x.com/12/';\nexports.API_ADS_SANDBOX_PREFIX = 'https://ads-api-sandbox.twitter.com/12/';\n",
6
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PreviousableTwitterPaginator = exports.TwitterPaginator = void 0;\n/** TwitterPaginator: able to get consume data from initial request, then fetch next data sequentially. */\nclass TwitterPaginator {\n // noinspection TypeScriptAbstractClassConstructorCanBeMadeProtected\n constructor({ realData, rateLimit, instance, queryParams, sharedParams }) {\n this._maxResultsWhenFetchLast = 100;\n this._realData = realData;\n this._rateLimit = rateLimit;\n this._instance = instance;\n this._queryParams = queryParams;\n this._sharedParams = sharedParams;\n }\n get _isRateLimitOk() {\n if (!this._rateLimit) {\n return true;\n }\n const resetDate = this._rateLimit.reset * 1000;\n if (resetDate < Date.now()) {\n return true;\n }\n return this._rateLimit.remaining > 0;\n }\n makeRequest(queryParams) {\n return this._instance.get(this.getEndpoint(), queryParams, { fullResponse: true, params: this._sharedParams });\n }\n makeNewInstanceFromResult(result, queryParams) {\n // Construct a subclass\n return new this.constructor({\n realData: result.data,\n rateLimit: result.rateLimit,\n instance: this._instance,\n queryParams,\n sharedParams: this._sharedParams,\n });\n }\n getEndpoint() {\n return this._endpoint;\n }\n injectQueryParams(maxResults) {\n return {\n ...(maxResults ? { max_results: maxResults } : {}),\n ...this._queryParams,\n };\n }\n /* ---------------------- */\n /* Real paginator methods */\n /* ---------------------- */\n /**\n * Next page.\n */\n async next(maxResults) {\n const queryParams = this.getNextQueryParams(maxResults);\n const result = await this.makeRequest(queryParams);\n return this.makeNewInstanceFromResult(result, queryParams);\n }\n /**\n * Next page, but store it in current instance.\n */\n async fetchNext(maxResults) {\n const queryParams = this.getNextQueryParams(maxResults);\n const result = await this.makeRequest(queryParams);\n // Await in case of async sub-methods\n await this.refreshInstanceFromResult(result, true);\n return this;\n }\n /**\n * Fetch up to {count} items after current page,\n * as long as rate limit is not hit and Twitter has some results\n */\n async fetchLast(count = Infinity) {\n let queryParams = this.getNextQueryParams(this._maxResultsWhenFetchLast);\n let resultCount = 0;\n // Break at rate limit limit\n while (resultCount < count && this._isRateLimitOk) {\n const response = await this.makeRequest(queryParams);\n await this.refreshInstanceFromResult(response, true);\n resultCount += this.getPageLengthFromRequest(response);\n if (this.isFetchLastOver(response)) {\n break;\n }\n queryParams = this.getNextQueryParams(this._maxResultsWhenFetchLast);\n }\n return this;\n }\n get rateLimit() {\n var _a;\n return { ...(_a = this._rateLimit) !== null && _a !== void 0 ? _a : {} };\n }\n /** Get raw data returned by Twitter API. */\n get data() {\n return this._realData;\n }\n get done() {\n return !this.canFetchNextPage(this._realData);\n }\n /**\n * Iterate over currently fetched items.\n */\n *[Symbol.iterator]() {\n yield* this.getItemArray();\n }\n /**\n * Iterate over items \"indefinitely\" (until rate limit is hit / they're no more items available)\n * This will **mutate the current instance** and fill data, metas, etc. inside this instance.\n *\n * If you need to handle concurrent requests, or you need to rely on immutability, please use `.fetchAndIterate()` instead.\n */\n async *[Symbol.asyncIterator]() {\n yield* this.getItemArray();\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let paginator = this;\n let canFetchNextPage = this.canFetchNextPage(this._realData);\n while (canFetchNextPage && this._isRateLimitOk && paginator.getItemArray().length > 0) {\n const next = await paginator.next(this._maxResultsWhenFetchLast);\n // Store data into current instance [needed to access includes and meta]\n this.refreshInstanceFromResult({ data: next._realData, headers: {}, rateLimit: next._rateLimit }, true);\n canFetchNextPage = this.canFetchNextPage(next._realData);\n const items = next.getItemArray();\n yield* items;\n paginator = next;\n }\n }\n /**\n * Iterate over items \"indefinitely\" without modifying the current instance (until rate limit is hit / they're no more items available)\n *\n * This will **NOT** mutate the current instance, meaning that current instance will not inherit from `includes` and `meta` (v2 API only).\n * Use `Symbol.asyncIterator` (`for-await of`) to directly access items with current instance mutation.\n */\n async *fetchAndIterate() {\n for (const item of this.getItemArray()) {\n yield [item, this];\n }\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let paginator = this;\n let canFetchNextPage = this.canFetchNextPage(this._realData);\n while (canFetchNextPage && this._isRateLimitOk && paginator.getItemArray().length > 0) {\n const next = await paginator.next(this._maxResultsWhenFetchLast);\n // Store data into current instance [needed to access includes and meta]\n this.refreshInstanceFromResult({ data: next._realData, headers: {}, rateLimit: next._rateLimit }, true);\n canFetchNextPage = this.canFetchNextPage(next._realData);\n for (const item of next.getItemArray()) {\n yield [item, next];\n }\n this._rateLimit = next._rateLimit;\n paginator = next;\n }\n }\n}\nexports.TwitterPaginator = TwitterPaginator;\n/** PreviousableTwitterPaginator: a TwitterPaginator able to get consume data from both side, next and previous. */\nclass PreviousableTwitterPaginator extends TwitterPaginator {\n /**\n * Previous page (new tweets)\n */\n async previous(maxResults) {\n const queryParams = this.getPreviousQueryParams(maxResults);\n const result = await this.makeRequest(queryParams);\n return this.makeNewInstanceFromResult(result, queryParams);\n }\n /**\n * Previous page, but in current instance.\n */\n async fetchPrevious(maxResults) {\n const queryParams = this.getPreviousQueryParams(maxResults);\n const result = await this.makeRequest(queryParams);\n await this.refreshInstanceFromResult(result, false);\n return this;\n }\n}\nexports.PreviousableTwitterPaginator = PreviousableTwitterPaginator;\nexports.default = TwitterPaginator;\n",
7
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CursoredV1Paginator = void 0;\nconst TwitterPaginator_1 = __importDefault(require(\"./TwitterPaginator\"));\nclass CursoredV1Paginator extends TwitterPaginator_1.default {\n getNextQueryParams(maxResults) {\n var _a;\n return {\n ...this._queryParams,\n cursor: (_a = this._realData.next_cursor_str) !== null && _a !== void 0 ? _a : this._realData.next_cursor,\n ...(maxResults ? { count: maxResults } : {}),\n };\n }\n isFetchLastOver(result) {\n // If we cant fetch next page\n return !this.canFetchNextPage(result.data);\n }\n canFetchNextPage(result) {\n // If one of cursor is valid\n return !this.isNextCursorInvalid(result.next_cursor) || !this.isNextCursorInvalid(result.next_cursor_str);\n }\n isNextCursorInvalid(value) {\n return value === undefined\n || value === 0\n || value === -1\n || value === '0'\n || value === '-1';\n }\n}\nexports.CursoredV1Paginator = CursoredV1Paginator;\n",
8
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WelcomeDmV1Paginator = exports.DmEventsV1Paginator = void 0;\nconst paginator_v1_1 = require(\"./paginator.v1\");\nclass DmEventsV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'direct_messages/events/list.json';\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.events.push(...result.events);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.events.length;\n }\n getItemArray() {\n return this.events;\n }\n /**\n * Events returned by paginator.\n */\n get events() {\n return this._realData.events;\n }\n}\nexports.DmEventsV1Paginator = DmEventsV1Paginator;\nclass WelcomeDmV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'direct_messages/welcome_messages/list.json';\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.welcome_messages.push(...result.welcome_messages);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.welcome_messages.length;\n }\n getItemArray() {\n return this.welcomeMessages;\n }\n get welcomeMessages() {\n return this._realData.welcome_messages;\n }\n}\nexports.WelcomeDmV1Paginator = WelcomeDmV1Paginator;\n",
9
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
10
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EUploadMimeType = void 0;\nvar EUploadMimeType;\n(function (EUploadMimeType) {\n EUploadMimeType[\"Jpeg\"] = \"image/jpeg\";\n EUploadMimeType[\"Mp4\"] = \"video/mp4\";\n EUploadMimeType[\"Mov\"] = \"video/quicktime\";\n EUploadMimeType[\"Gif\"] = \"image/gif\";\n EUploadMimeType[\"Png\"] = \"image/png\";\n EUploadMimeType[\"Srt\"] = \"text/plain\";\n EUploadMimeType[\"Webp\"] = \"image/webp\";\n})(EUploadMimeType = exports.EUploadMimeType || (exports.EUploadMimeType = {}));\n",
11
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
12
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
13
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
14
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
15
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
16
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EDirectMessageEventTypeV1 = void 0;\n// Creation of DMs\nvar EDirectMessageEventTypeV1;\n(function (EDirectMessageEventTypeV1) {\n EDirectMessageEventTypeV1[\"Create\"] = \"message_create\";\n EDirectMessageEventTypeV1[\"WelcomeCreate\"] = \"welcome_message\";\n})(EDirectMessageEventTypeV1 = exports.EDirectMessageEventTypeV1 || (exports.EDirectMessageEventTypeV1 = {}));\n",
17
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
18
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./streaming.v1.types\"), exports);\n__exportStar(require(\"./tweet.v1.types\"), exports);\n__exportStar(require(\"./entities.v1.types\"), exports);\n__exportStar(require(\"./user.v1.types\"), exports);\n__exportStar(require(\"./dev-utilities.v1.types\"), exports);\n__exportStar(require(\"./geo.v1.types\"), exports);\n__exportStar(require(\"./trends.v1.types\"), exports);\n__exportStar(require(\"./dm.v1.types\"), exports);\n__exportStar(require(\"./list.v1.types\"), exports);\n",
19
- "\"use strict\";\n// ---------------\n// -- Streaming --\n// ---------------\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
20
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
21
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
22
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
23
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
24
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
25
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
26
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./streaming.v2.types\"), exports);\n__exportStar(require(\"./tweet.v2.types\"), exports);\n__exportStar(require(\"./tweet.definition.v2\"), exports);\n__exportStar(require(\"./user.v2.types\"), exports);\n__exportStar(require(\"./spaces.v2.types\"), exports);\n__exportStar(require(\"./list.v2.types\"), exports);\n__exportStar(require(\"./community.v2.types\"), exports);\n",
27
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EApiV2ErrorCode = exports.EApiV1ErrorCode = exports.ApiResponseError = exports.ApiPartialResponseError = exports.ApiRequestError = exports.ETwitterApiError = void 0;\nvar ETwitterApiError;\n(function (ETwitterApiError) {\n ETwitterApiError[\"Request\"] = \"request\";\n ETwitterApiError[\"PartialResponse\"] = \"partial-response\";\n ETwitterApiError[\"Response\"] = \"response\";\n})(ETwitterApiError = exports.ETwitterApiError || (exports.ETwitterApiError = {}));\n/* ERRORS INSTANCES */\nclass ApiError extends Error {\n constructor() {\n super(...arguments);\n this.error = true;\n }\n}\nclass ApiRequestError extends ApiError {\n constructor(message, options) {\n super(message);\n this.type = ETwitterApiError.Request;\n Error.captureStackTrace(this, this.constructor);\n // Do not show on Node stack trace\n Object.defineProperty(this, '_options', { value: options });\n }\n get request() {\n return this._options.request;\n }\n get requestError() {\n return this._options.requestError;\n }\n toJSON() {\n return {\n type: this.type,\n error: this.requestError,\n };\n }\n}\nexports.ApiRequestError = ApiRequestError;\nclass ApiPartialResponseError extends ApiError {\n constructor(message, options) {\n super(message);\n this.type = ETwitterApiError.PartialResponse;\n Error.captureStackTrace(this, this.constructor);\n // Do not show on Node stack trace\n Object.defineProperty(this, '_options', { value: options });\n }\n get request() {\n return this._options.request;\n }\n get response() {\n return this._options.response;\n }\n get responseError() {\n return this._options.responseError;\n }\n get rawContent() {\n return this._options.rawContent;\n }\n toJSON() {\n return {\n type: this.type,\n error: this.responseError,\n };\n }\n}\nexports.ApiPartialResponseError = ApiPartialResponseError;\nclass ApiResponseError extends ApiError {\n constructor(message, options) {\n super(message);\n this.type = ETwitterApiError.Response;\n Error.captureStackTrace(this, this.constructor);\n // Do not show on Node stack trace\n Object.defineProperty(this, '_options', { value: options });\n this.code = options.code;\n this.headers = options.headers;\n this.rateLimit = options.rateLimit;\n // Fix bad error data payload on some v1 endpoints (see https://github.com/PLhery/node-twitter-api-v2/issues/342)\n if (options.data && typeof options.data === 'object' && 'error' in options.data && !options.data.errors) {\n const data = { ...options.data };\n data.errors = [{\n code: EApiV1ErrorCode.InternalError,\n message: data.error,\n }];\n this.data = data;\n }\n else {\n this.data = options.data;\n }\n }\n get request() {\n return this._options.request;\n }\n get response() {\n return this._options.response;\n }\n /** Check for presence of one of given v1/v2 error codes. */\n hasErrorCode(...codes) {\n const errors = this.errors;\n // No errors\n if (!(errors === null || errors === void 0 ? void 0 : errors.length)) {\n return false;\n }\n // v1 errors\n if ('code' in errors[0]) {\n const v1errors = errors;\n return v1errors.some(error => codes.includes(error.code));\n }\n // v2 error\n const v2error = this.data;\n return codes.includes(v2error.type);\n }\n get errors() {\n var _a;\n return (_a = this.data) === null || _a === void 0 ? void 0 : _a.errors;\n }\n get rateLimitError() {\n return this.code === 420 || this.code === 429;\n }\n get isAuthError() {\n if (this.code === 401) {\n return true;\n }\n return this.hasErrorCode(EApiV1ErrorCode.AuthTimestampInvalid, EApiV1ErrorCode.AuthenticationFail, EApiV1ErrorCode.BadAuthenticationData, EApiV1ErrorCode.InvalidOrExpiredToken);\n }\n toJSON() {\n return {\n type: this.type,\n code: this.code,\n error: this.data,\n rateLimit: this.rateLimit,\n headers: this.headers,\n };\n }\n}\nexports.ApiResponseError = ApiResponseError;\nvar EApiV1ErrorCode;\n(function (EApiV1ErrorCode) {\n // Location errors\n EApiV1ErrorCode[EApiV1ErrorCode[\"InvalidCoordinates\"] = 3] = \"InvalidCoordinates\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"NoLocationFound\"] = 13] = \"NoLocationFound\";\n // Authentication failures\n EApiV1ErrorCode[EApiV1ErrorCode[\"AuthenticationFail\"] = 32] = \"AuthenticationFail\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"InvalidOrExpiredToken\"] = 89] = \"InvalidOrExpiredToken\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"UnableToVerifyCredentials\"] = 99] = \"UnableToVerifyCredentials\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"AuthTimestampInvalid\"] = 135] = \"AuthTimestampInvalid\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"BadAuthenticationData\"] = 215] = \"BadAuthenticationData\";\n // Resources not found or visible\n EApiV1ErrorCode[EApiV1ErrorCode[\"NoUserMatch\"] = 17] = \"NoUserMatch\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"UserNotFound\"] = 50] = \"UserNotFound\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"ResourceNotFound\"] = 34] = \"ResourceNotFound\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TweetNotFound\"] = 144] = \"TweetNotFound\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TweetNotVisible\"] = 179] = \"TweetNotVisible\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"NotAllowedResource\"] = 220] = \"NotAllowedResource\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"MediaIdNotFound\"] = 325] = \"MediaIdNotFound\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TweetNoLongerAvailable\"] = 421] = \"TweetNoLongerAvailable\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TweetViolatedRules\"] = 422] = \"TweetViolatedRules\";\n // Account errors\n EApiV1ErrorCode[EApiV1ErrorCode[\"TargetUserSuspended\"] = 63] = \"TargetUserSuspended\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"YouAreSuspended\"] = 64] = \"YouAreSuspended\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"AccountUpdateFailed\"] = 120] = \"AccountUpdateFailed\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"NoSelfSpamReport\"] = 36] = \"NoSelfSpamReport\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"NoSelfMute\"] = 271] = \"NoSelfMute\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"AccountLocked\"] = 326] = \"AccountLocked\";\n // Application live errors / Twitter errors\n EApiV1ErrorCode[EApiV1ErrorCode[\"RateLimitExceeded\"] = 88] = \"RateLimitExceeded\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"NoDMRightForApp\"] = 93] = \"NoDMRightForApp\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"OverCapacity\"] = 130] = \"OverCapacity\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"InternalError\"] = 131] = \"InternalError\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TooManyFollowings\"] = 161] = \"TooManyFollowings\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TweetLimitExceeded\"] = 185] = \"TweetLimitExceeded\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"DuplicatedTweet\"] = 187] = \"DuplicatedTweet\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TooManySpamReports\"] = 205] = \"TooManySpamReports\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"RequestLooksLikeSpam\"] = 226] = \"RequestLooksLikeSpam\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"NoWriteRightForApp\"] = 261] = \"NoWriteRightForApp\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TweetActionsDisabled\"] = 425] = \"TweetActionsDisabled\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TweetRepliesRestricted\"] = 433] = \"TweetRepliesRestricted\";\n // Invalid request parameters\n EApiV1ErrorCode[EApiV1ErrorCode[\"NamedParameterMissing\"] = 38] = \"NamedParameterMissing\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"InvalidAttachmentUrl\"] = 44] = \"InvalidAttachmentUrl\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TweetTextTooLong\"] = 186] = \"TweetTextTooLong\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"MissingUrlParameter\"] = 195] = \"MissingUrlParameter\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"NoMultipleGifs\"] = 323] = \"NoMultipleGifs\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"InvalidMediaIds\"] = 324] = \"InvalidMediaIds\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"InvalidUrl\"] = 407] = \"InvalidUrl\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TooManyTweetAttachments\"] = 386] = \"TooManyTweetAttachments\";\n // Already sent/deleted item\n EApiV1ErrorCode[EApiV1ErrorCode[\"StatusAlreadyFavorited\"] = 139] = \"StatusAlreadyFavorited\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"FollowRequestAlreadySent\"] = 160] = \"FollowRequestAlreadySent\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"CannotUnmuteANonMutedAccount\"] = 272] = \"CannotUnmuteANonMutedAccount\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"TweetAlreadyRetweeted\"] = 327] = \"TweetAlreadyRetweeted\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"ReplyToDeletedTweet\"] = 385] = \"ReplyToDeletedTweet\";\n // DM Errors\n EApiV1ErrorCode[EApiV1ErrorCode[\"DMReceiverNotFollowingYou\"] = 150] = \"DMReceiverNotFollowingYou\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"UnableToSendDM\"] = 151] = \"UnableToSendDM\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"MustAllowDMFromAnyone\"] = 214] = \"MustAllowDMFromAnyone\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"CannotSendDMToThisUser\"] = 349] = \"CannotSendDMToThisUser\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"DMTextTooLong\"] = 354] = \"DMTextTooLong\";\n // Application misconfiguration\n EApiV1ErrorCode[EApiV1ErrorCode[\"SubscriptionAlreadyExists\"] = 355] = \"SubscriptionAlreadyExists\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"CallbackUrlNotApproved\"] = 415] = \"CallbackUrlNotApproved\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"SuspendedApplication\"] = 416] = \"SuspendedApplication\";\n EApiV1ErrorCode[EApiV1ErrorCode[\"OobOauthIsNotAllowed\"] = 417] = \"OobOauthIsNotAllowed\";\n})(EApiV1ErrorCode = exports.EApiV1ErrorCode || (exports.EApiV1ErrorCode = {}));\nvar EApiV2ErrorCode;\n(function (EApiV2ErrorCode) {\n // Request errors\n EApiV2ErrorCode[\"InvalidRequest\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#invalid-request\";\n EApiV2ErrorCode[\"ClientForbidden\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#client-forbidden\";\n EApiV2ErrorCode[\"UnsupportedAuthentication\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#unsupported-authentication\";\n // Stream rules errors\n EApiV2ErrorCode[\"InvalidRules\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#invalid-rules\";\n EApiV2ErrorCode[\"TooManyRules\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#rule-cap\";\n EApiV2ErrorCode[\"DuplicatedRules\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#duplicate-rules\";\n // Twitter errors\n EApiV2ErrorCode[\"RateLimitExceeded\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#usage-capped\";\n EApiV2ErrorCode[\"ConnectionError\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#streaming-connection\";\n EApiV2ErrorCode[\"ClientDisconnected\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#client-disconnected\";\n EApiV2ErrorCode[\"TwitterDisconnectedYou\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#operational-disconnect\";\n // Resource errors\n EApiV2ErrorCode[\"ResourceNotFound\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#resource-not-found\";\n EApiV2ErrorCode[\"ResourceUnauthorized\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#not-authorized-for-resource\";\n EApiV2ErrorCode[\"DisallowedResource\"] = \"https://developer.x.com/en/support/x-api/error-troubleshooting#disallowed-resource\";\n})(EApiV2ErrorCode = exports.EApiV2ErrorCode || (exports.EApiV2ErrorCode = {}));\n",
28
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
29
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ETwitterStreamEvent = void 0;\nvar ETwitterStreamEvent;\n(function (ETwitterStreamEvent) {\n ETwitterStreamEvent[\"Connected\"] = \"connected\";\n ETwitterStreamEvent[\"ConnectError\"] = \"connect error\";\n ETwitterStreamEvent[\"ConnectionError\"] = \"connection error\";\n ETwitterStreamEvent[\"ConnectionClosed\"] = \"connection closed\";\n ETwitterStreamEvent[\"ConnectionLost\"] = \"connection lost\";\n ETwitterStreamEvent[\"ReconnectAttempt\"] = \"reconnect attempt\";\n ETwitterStreamEvent[\"Reconnected\"] = \"reconnected\";\n ETwitterStreamEvent[\"ReconnectError\"] = \"reconnect error\";\n ETwitterStreamEvent[\"ReconnectLimitExceeded\"] = \"reconnect limit exceeded\";\n ETwitterStreamEvent[\"DataKeepAlive\"] = \"data keep-alive\";\n ETwitterStreamEvent[\"Data\"] = \"data event content\";\n ETwitterStreamEvent[\"DataError\"] = \"data twitter error\";\n ETwitterStreamEvent[\"TweetParseError\"] = \"data tweet parse error\";\n ETwitterStreamEvent[\"Error\"] = \"stream error\";\n})(ETwitterStreamEvent = exports.ETwitterStreamEvent || (exports.ETwitterStreamEvent = {}));\n",
30
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n",
31
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TwitterApiPluginResponseOverride = void 0;\nclass TwitterApiPluginResponseOverride {\n constructor(value) {\n this.value = value;\n }\n}\nexports.TwitterApiPluginResponseOverride = TwitterApiPluginResponseOverride;\n",
32
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./client.plugins.types\"), exports);\n",
33
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./v1\"), exports);\n__exportStar(require(\"./v2\"), exports);\n__exportStar(require(\"./errors.types\"), exports);\n__exportStar(require(\"./responses.types\"), exports);\n__exportStar(require(\"./client.types\"), exports);\n__exportStar(require(\"./auth.types\"), exports);\n__exportStar(require(\"./plugins\"), exports);\n",
34
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TwitterApiV2Settings = void 0;\nexports.TwitterApiV2Settings = {\n debug: false,\n deprecationWarnings: true,\n logger: { log: console.log.bind(console) },\n};\n",
35
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.safeDeprecationWarning = exports.hasMultipleItems = exports.isTweetStreamV2ErrorPayload = exports.trimUndefinedProperties = exports.arrayWrap = exports.sharedPromise = void 0;\nconst settings_1 = require(\"./settings\");\nfunction sharedPromise(getter) {\n const sharedPromise = {\n value: undefined,\n promise: getter().then(val => {\n sharedPromise.value = val;\n return val;\n }),\n };\n return sharedPromise;\n}\nexports.sharedPromise = sharedPromise;\nfunction arrayWrap(value) {\n if (Array.isArray(value)) {\n return value;\n }\n return [value];\n}\nexports.arrayWrap = arrayWrap;\nfunction trimUndefinedProperties(object) {\n // Delete undefined parameters\n for (const parameter of Object.keys(object)) {\n if (object[parameter] === undefined) {\n delete object[parameter];\n }\n }\n}\nexports.trimUndefinedProperties = trimUndefinedProperties;\nfunction isTweetStreamV2ErrorPayload(payload) {\n // Is error only if 'errors' is present and 'data' does not exists\n return typeof payload === 'object'\n && 'errors' in payload\n && !('data' in payload);\n}\nexports.isTweetStreamV2ErrorPayload = isTweetStreamV2ErrorPayload;\nfunction hasMultipleItems(item) {\n if (Array.isArray(item) && item.length > 1) {\n return true;\n }\n return item.toString().includes(',');\n}\nexports.hasMultipleItems = hasMultipleItems;\nconst deprecationWarningsCache = new Set();\nfunction safeDeprecationWarning(message) {\n if (typeof console === 'undefined' || !console.warn || !settings_1.TwitterApiV2Settings.deprecationWarnings) {\n return;\n }\n const hash = `${message.instance}-${message.method}-${message.problem}`;\n if (deprecationWarningsCache.has(hash)) {\n return;\n }\n const formattedMsg = `[twitter-api-v2] Deprecation warning: In ${message.instance}.${message.method}() call` +\n `, ${message.problem}.\\n${message.resolution}.`;\n console.warn(formattedMsg);\n console.warn('To disable this message, import variable TwitterApiV2Settings from twitter-api-v2 and set TwitterApiV2Settings.deprecationWarnings to false.');\n deprecationWarningsCache.add(hash);\n}\nexports.safeDeprecationWarning = safeDeprecationWarning;\n",
36
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RequestHandlerHelper = void 0;\nconst https_1 = require(\"https\");\nconst settings_1 = require(\"../settings\");\nconst TweetStream_1 = __importDefault(require(\"../stream/TweetStream\"));\nconst types_1 = require(\"../types\");\nconst zlib = __importStar(require(\"zlib\"));\nconst events_1 = require(\"events\");\nclass RequestHandlerHelper {\n constructor(requestData) {\n this.requestData = requestData;\n this.requestErrorHandled = false;\n this.responseData = [];\n }\n /* Request helpers */\n get hrefPathname() {\n const url = this.requestData.url;\n return url.hostname + url.pathname;\n }\n isCompressionDisabled() {\n return !this.requestData.compression || this.requestData.compression === 'identity';\n }\n isFormEncodedEndpoint() {\n return this.requestData.url.href.startsWith('https://api.x.com/oauth/');\n }\n /* Error helpers */\n createRequestError(error) {\n if (settings_1.TwitterApiV2Settings.debug) {\n settings_1.TwitterApiV2Settings.logger.log('Request error:', error);\n }\n return new types_1.ApiRequestError('Request failed.', {\n request: this.req,\n error,\n });\n }\n createPartialResponseError(error, abortClose) {\n const res = this.res;\n let message = `Request failed with partial response with HTTP code ${res.statusCode}`;\n if (abortClose) {\n message += ' (connection abruptly closed)';\n }\n else {\n message += ' (parse error)';\n }\n return new types_1.ApiPartialResponseError(message, {\n request: this.req,\n response: this.res,\n responseError: error,\n rawContent: Buffer.concat(this.responseData).toString(),\n });\n }\n formatV1Errors(errors) {\n return errors\n .map(({ code, message }) => `${message} (Twitter code ${code})`)\n .join(', ');\n }\n formatV2Error(error) {\n return `${error.title}: ${error.detail} (see ${error.type})`;\n }\n createResponseError({ res, data, rateLimit, code }) {\n var _a;\n if (settings_1.TwitterApiV2Settings.debug) {\n settings_1.TwitterApiV2Settings.logger.log(`Request failed with code ${code}, data:`, data);\n settings_1.TwitterApiV2Settings.logger.log('Response headers:', res.headers);\n }\n // Errors formatting.\n let errorString = `Request failed with code ${code}`;\n if ((_a = data === null || data === void 0 ? void 0 : data.errors) === null || _a === void 0 ? void 0 : _a.length) {\n const errors = data.errors;\n if (typeof errors[0] === 'object' && 'code' in errors[0]) {\n errorString += ' - ' + this.formatV1Errors(errors);\n }\n else {\n errorString += ' - ' + this.formatV2Error(data);\n }\n }\n return new types_1.ApiResponseError(errorString, {\n code,\n data,\n headers: res.headers,\n request: this.req,\n response: res,\n rateLimit,\n });\n }\n /* Response helpers */\n getResponseDataStream(res) {\n if (this.isCompressionDisabled()) {\n return res;\n }\n const contentEncoding = (res.headers['content-encoding'] || 'identity').trim().toLowerCase();\n if (contentEncoding === 'br') {\n const brotli = zlib.createBrotliDecompress({\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH,\n });\n res.pipe(brotli);\n return brotli;\n }\n if (contentEncoding === 'gzip') {\n const gunzip = zlib.createGunzip({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n res.pipe(gunzip);\n return gunzip;\n }\n if (contentEncoding === 'deflate') {\n const inflate = zlib.createInflate({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n res.pipe(inflate);\n return inflate;\n }\n return res;\n }\n detectResponseType(res) {\n var _a, _b;\n // Auto parse if server responds with JSON body\n if (((_a = res.headers['content-type']) === null || _a === void 0 ? void 0 : _a.includes('application/json')) || ((_b = res.headers['content-type']) === null || _b === void 0 ? void 0 : _b.includes('application/problem+json'))) {\n return 'json';\n }\n // f-e oauth token endpoints\n else if (this.isFormEncodedEndpoint()) {\n return 'url';\n }\n return 'text';\n }\n getParsedResponse(res) {\n const data = this.responseData;\n const mode = this.requestData.forceParseMode || this.detectResponseType(res);\n if (mode === 'buffer') {\n return Buffer.concat(data);\n }\n else if (mode === 'text') {\n return Buffer.concat(data).toString();\n }\n else if (mode === 'json') {\n const asText = Buffer.concat(data).toString();\n return asText.length ? JSON.parse(asText) : undefined;\n }\n else if (mode === 'url') {\n const asText = Buffer.concat(data).toString();\n const formEntries = {};\n for (const [item, value] of new URLSearchParams(asText)) {\n formEntries[item] = value;\n }\n return formEntries;\n }\n else {\n // mode === 'none'\n return undefined;\n }\n }\n getRateLimitFromResponse(res) {\n let rateLimit = undefined;\n if (res.headers['x-rate-limit-limit']) {\n rateLimit = {\n limit: Number(res.headers['x-rate-limit-limit']),\n remaining: Number(res.headers['x-rate-limit-remaining']),\n reset: Number(res.headers['x-rate-limit-reset']),\n };\n if (res.headers['x-app-limit-24hour-limit']) {\n rateLimit.day = {\n limit: Number(res.headers['x-app-limit-24hour-limit']),\n remaining: Number(res.headers['x-app-limit-24hour-remaining']),\n reset: Number(res.headers['x-app-limit-24hour-reset']),\n };\n }\n if (res.headers['x-user-limit-24hour-limit']) {\n rateLimit.userDay = {\n limit: Number(res.headers['x-user-limit-24hour-limit']),\n remaining: Number(res.headers['x-user-limit-24hour-remaining']),\n reset: Number(res.headers['x-user-limit-24hour-reset']),\n };\n }\n if (this.requestData.rateLimitSaver) {\n this.requestData.rateLimitSaver(rateLimit);\n }\n }\n return rateLimit;\n }\n /* Request event handlers */\n onSocketEventHandler(reject, cleanupListener, socket) {\n const onClose = this.onSocketCloseHandler.bind(this, reject);\n socket.on('close', onClose);\n cleanupListener.on('complete', () => socket.off('close', onClose));\n }\n onSocketCloseHandler(reject) {\n this.req.removeAllListeners('timeout');\n const res = this.res;\n if (res) {\n // Response ok, res.close/res.end can handle request ending\n return;\n }\n if (!this.requestErrorHandled) {\n return reject(this.createRequestError(new Error('Socket closed without any information.')));\n }\n // else: other situation\n }\n requestErrorHandler(reject, requestError) {\n var _a, _b;\n (_b = (_a = this.requestData).requestEventDebugHandler) === null || _b === void 0 ? void 0 : _b.call(_a, 'request-error', { requestError });\n this.requestErrorHandled = true;\n reject(this.createRequestError(requestError));\n }\n timeoutErrorHandler() {\n this.requestErrorHandled = true;\n this.req.destroy(new Error('Request timeout.'));\n }\n /* Response event handlers */\n classicResponseHandler(resolve, reject, res) {\n this.res = res;\n const dataStream = this.getResponseDataStream(res);\n // Register the response data\n dataStream.on('data', chunk => this.responseData.push(chunk));\n dataStream.on('end', this.onResponseEndHandler.bind(this, resolve, reject));\n dataStream.on('close', this.onResponseCloseHandler.bind(this, resolve, reject));\n // Debug handlers\n if (this.requestData.requestEventDebugHandler) {\n this.requestData.requestEventDebugHandler('response', { res });\n res.on('aborted', error => this.requestData.requestEventDebugHandler('response-aborted', { error }));\n res.on('error', error => this.requestData.requestEventDebugHandler('response-error', { error }));\n res.on('close', () => this.requestData.requestEventDebugHandler('response-close', { data: this.responseData }));\n res.on('end', () => this.requestData.requestEventDebugHandler('response-end'));\n }\n }\n onResponseEndHandler(resolve, reject) {\n const rateLimit = this.getRateLimitFromResponse(this.res);\n let data;\n try {\n data = this.getParsedResponse(this.res);\n }\n catch (e) {\n reject(this.createPartialResponseError(e, false));\n return;\n }\n // Handle bad error codes\n const code = this.res.statusCode;\n if (code >= 400) {\n reject(this.createResponseError({ data, res: this.res, rateLimit, code }));\n return;\n }\n if (settings_1.TwitterApiV2Settings.debug) {\n settings_1.TwitterApiV2Settings.logger.log(`[${this.requestData.options.method} ${this.hrefPathname}]: Request succeeds with code ${this.res.statusCode}`);\n settings_1.TwitterApiV2Settings.logger.log('Response body:', data);\n }\n resolve({\n data,\n headers: this.res.headers,\n rateLimit,\n });\n }\n onResponseCloseHandler(resolve, reject) {\n const res = this.res;\n if (res.aborted) {\n // Try to parse the request (?)\n try {\n this.getParsedResponse(this.res);\n // Ok, try to resolve normally the request\n return this.onResponseEndHandler(resolve, reject);\n }\n catch (e) {\n // Parse error, just drop with content\n return reject(this.createPartialResponseError(e, true));\n }\n }\n if (!res.complete) {\n return reject(this.createPartialResponseError(new Error('Response has been interrupted before response could be parsed.'), true));\n }\n // else: end has been called\n }\n streamResponseHandler(resolve, reject, res) {\n const code = res.statusCode;\n if (code < 400) {\n if (settings_1.TwitterApiV2Settings.debug) {\n settings_1.TwitterApiV2Settings.logger.log(`[${this.requestData.options.method} ${this.hrefPathname}]: Request succeeds with code ${res.statusCode} (starting stream)`);\n }\n const dataStream = this.getResponseDataStream(res);\n // HTTP code ok, consume stream\n resolve({ req: this.req, res: dataStream, originalResponse: res, requestData: this.requestData });\n }\n else {\n // Handle response normally, can only rejects\n this.classicResponseHandler(() => undefined, reject, res);\n }\n }\n /* Wrappers for request lifecycle */\n debugRequest() {\n const url = this.requestData.url;\n settings_1.TwitterApiV2Settings.logger.log(`[${this.requestData.options.method} ${this.hrefPathname}]`, this.requestData.options);\n if (url.search) {\n settings_1.TwitterApiV2Settings.logger.log('Request parameters:', [...url.searchParams.entries()].map(([key, value]) => `${key}: ${value}`));\n }\n if (this.requestData.body) {\n settings_1.TwitterApiV2Settings.logger.log('Request body:', this.requestData.body);\n }\n }\n buildRequest() {\n var _a;\n const url = this.requestData.url;\n const auth = url.username ? `${url.username}:${url.password}` : undefined;\n const headers = (_a = this.requestData.options.headers) !== null && _a !== void 0 ? _a : {};\n if (this.requestData.compression === true || this.requestData.compression === 'brotli') {\n headers['accept-encoding'] = 'br;q=1.0, gzip;q=0.8, deflate;q=0.5, *;q=0.1';\n }\n else if (this.requestData.compression === 'gzip') {\n headers['accept-encoding'] = 'gzip;q=1, deflate;q=0.5, *;q=0.1';\n }\n else if (this.requestData.compression === 'deflate') {\n headers['accept-encoding'] = 'deflate;q=1, *;q=0.1';\n }\n if (settings_1.TwitterApiV2Settings.debug) {\n this.debugRequest();\n }\n this.req = (0, https_1.request)({\n ...this.requestData.options,\n // Define URL params manually, addresses dependencies error https://github.com/PLhery/node-twitter-api-v2/issues/94\n host: url.hostname,\n port: url.port || undefined,\n path: url.pathname + url.search,\n protocol: url.protocol,\n auth,\n headers,\n });\n }\n registerRequestEventDebugHandlers(req) {\n req.on('close', () => this.requestData.requestEventDebugHandler('close'));\n req.on('abort', () => this.requestData.requestEventDebugHandler('abort'));\n req.on('socket', socket => {\n this.requestData.requestEventDebugHandler('socket', { socket });\n socket.on('error', error => this.requestData.requestEventDebugHandler('socket-error', { socket, error }));\n socket.on('connect', () => this.requestData.requestEventDebugHandler('socket-connect', { socket }));\n socket.on('close', withError => this.requestData.requestEventDebugHandler('socket-close', { socket, withError }));\n socket.on('end', () => this.requestData.requestEventDebugHandler('socket-end', { socket }));\n socket.on('lookup', (...data) => this.requestData.requestEventDebugHandler('socket-lookup', { socket, data }));\n socket.on('timeout', () => this.requestData.requestEventDebugHandler('socket-timeout', { socket }));\n });\n }\n makeRequest() {\n this.buildRequest();\n return new Promise((_resolve, _reject) => {\n // Hooks to call when promise is fulfulled to cleanup the socket (shared between requests)\n const resolve = value => {\n cleanupListener.emit('complete');\n _resolve(value);\n };\n const reject = value => {\n cleanupListener.emit('complete');\n _reject(value);\n };\n const cleanupListener = new events_1.EventEmitter();\n const req = this.req;\n // Handle request errors\n req.on('error', this.requestErrorHandler.bind(this, reject));\n req.on('socket', this.onSocketEventHandler.bind(this, reject, cleanupListener));\n req.on('response', this.classicResponseHandler.bind(this, resolve, reject));\n if (this.requestData.options.timeout) {\n req.on('timeout', this.timeoutErrorHandler.bind(this));\n }\n // Debug handlers\n if (this.requestData.requestEventDebugHandler) {\n this.registerRequestEventDebugHandlers(req);\n }\n if (this.requestData.body) {\n req.write(this.requestData.body);\n }\n req.end();\n });\n }\n async makeRequestAsStream() {\n const { req, res, requestData, originalResponse } = await this.makeRequestAndResolveWhenReady();\n return new TweetStream_1.default(requestData, { req, res, originalResponse });\n }\n makeRequestAndResolveWhenReady() {\n this.buildRequest();\n return new Promise((resolve, reject) => {\n const req = this.req;\n // Handle request errors\n req.on('error', this.requestErrorHandler.bind(this, reject));\n req.on('response', this.streamResponseHandler.bind(this, resolve, reject));\n if (this.requestData.body) {\n req.write(this.requestData.body);\n }\n req.end();\n });\n }\n}\nexports.RequestHandlerHelper = RequestHandlerHelper;\nexports.default = RequestHandlerHelper;\n",
37
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TweetStreamEventCombiner = void 0;\nconst events_1 = require(\"events\");\nconst types_1 = require(\"../types\");\nclass TweetStreamEventCombiner extends events_1.EventEmitter {\n constructor(stream) {\n super();\n this.stream = stream;\n this.stack = [];\n this.onStreamData = this.onStreamData.bind(this);\n this.onStreamError = this.onStreamError.bind(this);\n this.onceNewEvent = this.once.bind(this, 'event');\n // Init events from stream\n stream.on(types_1.ETwitterStreamEvent.Data, this.onStreamData);\n // Ignore reconnect errors: Don't close event combiner until connection error/closed\n stream.on(types_1.ETwitterStreamEvent.ConnectionError, this.onStreamError);\n stream.on(types_1.ETwitterStreamEvent.TweetParseError, this.onStreamError);\n stream.on(types_1.ETwitterStreamEvent.ConnectionClosed, this.onStreamError);\n }\n /** Returns a new `Promise` that will `resolve` on next event (`data` or any sort of error). */\n nextEvent() {\n return new Promise(this.onceNewEvent);\n }\n /** Returns `true` if there's something in the stack. */\n hasStack() {\n return this.stack.length > 0;\n }\n /** Returns stacked data events, and clean the stack. */\n popStack() {\n const stack = this.stack;\n this.stack = [];\n return stack;\n }\n /** Cleanup all the listeners attached on stream. */\n destroy() {\n this.removeAllListeners();\n this.stream.off(types_1.ETwitterStreamEvent.Data, this.onStreamData);\n this.stream.off(types_1.ETwitterStreamEvent.ConnectionError, this.onStreamError);\n this.stream.off(types_1.ETwitterStreamEvent.TweetParseError, this.onStreamError);\n this.stream.off(types_1.ETwitterStreamEvent.ConnectionClosed, this.onStreamError);\n }\n emitEvent(type, payload) {\n this.emit('event', { type, payload });\n }\n onStreamError(payload) {\n this.emitEvent('error', payload);\n }\n onStreamData(payload) {\n this.stack.push(payload);\n this.emitEvent('data', payload);\n }\n}\nexports.TweetStreamEventCombiner = TweetStreamEventCombiner;\nexports.default = TweetStreamEventCombiner;\n",
38
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EStreamParserEvent = void 0;\nconst events_1 = require(\"events\");\nclass TweetStreamParser extends events_1.EventEmitter {\n constructor() {\n super(...arguments);\n this.currentMessage = '';\n }\n // Code partially belongs to twitter-stream-api for this\n // https://github.com/trygve-lie/twitter-stream-api/blob/master/lib/parser.js\n push(chunk) {\n this.currentMessage += chunk;\n chunk = this.currentMessage;\n const size = chunk.length;\n let start = 0;\n let offset = 0;\n while (offset < size) {\n // Take [offset, offset+1] inside a new string\n if (chunk.slice(offset, offset + 2) === '\\r\\n') {\n // If chunk contains \\r\\n after current offset,\n // parse [start, ..., offset] as a tweet\n const piece = chunk.slice(start, offset);\n start = offset += 2;\n // If empty object\n if (!piece.length) {\n continue;\n }\n try {\n const payload = JSON.parse(piece);\n if (payload) {\n this.emit(EStreamParserEvent.ParsedData, payload);\n continue;\n }\n }\n catch (error) {\n this.emit(EStreamParserEvent.ParseError, error);\n }\n }\n offset++;\n }\n this.currentMessage = chunk.slice(start, size);\n }\n /** Reset the currently stored message (f.e. on connection reset) */\n reset() {\n this.currentMessage = '';\n }\n}\nexports.default = TweetStreamParser;\nvar EStreamParserEvent;\n(function (EStreamParserEvent) {\n EStreamParserEvent[\"ParsedData\"] = \"parsed data\";\n EStreamParserEvent[\"ParseError\"] = \"parse error\";\n})(EStreamParserEvent = exports.EStreamParserEvent || (exports.EStreamParserEvent = {}));\n",
39
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TweetStream = void 0;\nconst events_1 = require(\"events\");\nconst request_handler_helper_1 = __importDefault(require(\"../client-mixins/request-handler.helper\"));\nconst types_1 = require(\"../types\");\nconst TweetStreamEventCombiner_1 = __importDefault(require(\"./TweetStreamEventCombiner\"));\nconst TweetStreamParser_1 = __importStar(require(\"./TweetStreamParser\"));\n// In seconds\nconst basicRetriesAttempt = [5, 15, 30, 60, 90, 120, 180, 300, 600, 900];\n// Default retry function\nconst basicReconnectRetry = tryOccurrence => tryOccurrence > basicRetriesAttempt.length\n ? 901000\n : basicRetriesAttempt[tryOccurrence - 1] * 1000;\nclass TweetStream extends events_1.EventEmitter {\n constructor(requestData, connection) {\n super();\n this.requestData = requestData;\n this.autoReconnect = false;\n this.autoReconnectRetries = 5;\n // 2 minutes without any Twitter signal\n this.keepAliveTimeoutMs = 1000 * 120;\n this.nextRetryTimeout = basicReconnectRetry;\n this.parser = new TweetStreamParser_1.default();\n this.connectionProcessRunning = false;\n this.onKeepAliveTimeout = this.onKeepAliveTimeout.bind(this);\n this.initEventsFromParser();\n if (connection) {\n this.req = connection.req;\n this.res = connection.res;\n this.originalResponse = connection.originalResponse;\n this.initEventsFromRequest();\n }\n }\n on(event, handler) {\n return super.on(event, handler);\n }\n initEventsFromRequest() {\n if (!this.req || !this.res) {\n throw new Error('TweetStream error: You cannot init TweetStream without a request and response object.');\n }\n const errorHandler = (err) => {\n this.emit(types_1.ETwitterStreamEvent.ConnectionError, err);\n this.emit(types_1.ETwitterStreamEvent.Error, {\n type: types_1.ETwitterStreamEvent.ConnectionError,\n error: err,\n message: 'Connection lost or closed by Twitter.',\n });\n this.onConnectionError();\n };\n this.req.on('error', errorHandler);\n this.res.on('error', errorHandler);\n // Usually, connection should not be closed by Twitter!\n this.res.on('close', () => errorHandler(new Error('Connection closed by Twitter.')));\n this.res.on('data', (chunk) => {\n this.resetKeepAliveTimeout();\n if (chunk.toString() === '\\r\\n') {\n return this.emit(types_1.ETwitterStreamEvent.DataKeepAlive);\n }\n this.parser.push(chunk.toString());\n });\n // Starts the keep alive timeout\n this.resetKeepAliveTimeout();\n }\n initEventsFromParser() {\n const payloadIsError = this.requestData.payloadIsError;\n this.parser.on(TweetStreamParser_1.EStreamParserEvent.ParsedData, (eventData) => {\n if (payloadIsError && payloadIsError(eventData)) {\n this.emit(types_1.ETwitterStreamEvent.DataError, eventData);\n this.emit(types_1.ETwitterStreamEvent.Error, {\n type: types_1.ETwitterStreamEvent.DataError,\n error: eventData,\n message: 'Twitter sent a payload that is detected as an error payload.',\n });\n }\n else {\n this.emit(types_1.ETwitterStreamEvent.Data, eventData);\n }\n });\n this.parser.on(TweetStreamParser_1.EStreamParserEvent.ParseError, (error) => {\n this.emit(types_1.ETwitterStreamEvent.TweetParseError, error);\n this.emit(types_1.ETwitterStreamEvent.Error, {\n type: types_1.ETwitterStreamEvent.TweetParseError,\n error,\n message: 'Failed to parse stream data.',\n });\n });\n }\n resetKeepAliveTimeout() {\n this.unbindKeepAliveTimeout();\n if (this.keepAliveTimeoutMs !== Infinity) {\n this.keepAliveTimeout = setTimeout(this.onKeepAliveTimeout, this.keepAliveTimeoutMs);\n }\n }\n onKeepAliveTimeout() {\n this.emit(types_1.ETwitterStreamEvent.ConnectionLost);\n this.onConnectionError();\n }\n unbindTimeouts() {\n this.unbindRetryTimeout();\n this.unbindKeepAliveTimeout();\n }\n unbindKeepAliveTimeout() {\n if (this.keepAliveTimeout) {\n clearTimeout(this.keepAliveTimeout);\n this.keepAliveTimeout = undefined;\n }\n }\n unbindRetryTimeout() {\n if (this.retryTimeout) {\n clearTimeout(this.retryTimeout);\n this.retryTimeout = undefined;\n }\n }\n closeWithoutEmit() {\n this.unbindTimeouts();\n if (this.res) {\n this.res.removeAllListeners();\n // Close response silently\n this.res.destroy();\n }\n if (this.req) {\n this.req.removeAllListeners();\n // Close connection silently\n this.req.destroy();\n }\n }\n /** Terminate connection to Twitter. */\n close() {\n this.emit(types_1.ETwitterStreamEvent.ConnectionClosed);\n this.closeWithoutEmit();\n }\n /** Unbind all listeners, and close connection. */\n destroy() {\n this.removeAllListeners();\n this.close();\n }\n /**\n * Make a new request that creates a new `TweetStream` instance with\n * the same parameters, and bind current listeners to new stream.\n */\n async clone() {\n const newRequest = new request_handler_helper_1.default(this.requestData);\n const newStream = await newRequest.makeRequestAsStream();\n // Clone attached listeners\n const listenerNames = this.eventNames();\n for (const listener of listenerNames) {\n const callbacks = this.listeners(listener);\n for (const callback of callbacks) {\n newStream.on(listener, callback);\n }\n }\n return newStream;\n }\n /** Start initial stream connection, setup options on current instance and returns itself. */\n async connect(options = {}) {\n if (typeof options.autoReconnect !== 'undefined') {\n this.autoReconnect = options.autoReconnect;\n }\n if (typeof options.autoReconnectRetries !== 'undefined') {\n this.autoReconnectRetries = options.autoReconnectRetries === 'unlimited'\n ? Infinity\n : options.autoReconnectRetries;\n }\n if (typeof options.keepAliveTimeout !== 'undefined') {\n this.keepAliveTimeoutMs = options.keepAliveTimeout === 'disable'\n ? Infinity\n : options.keepAliveTimeout;\n }\n if (typeof options.nextRetryTimeout !== 'undefined') {\n this.nextRetryTimeout = options.nextRetryTimeout;\n }\n // Make the connection\n this.unbindTimeouts();\n try {\n await this.reconnect();\n }\n catch (e) {\n this.emit(types_1.ETwitterStreamEvent.ConnectError, 0);\n this.emit(types_1.ETwitterStreamEvent.Error, {\n type: types_1.ETwitterStreamEvent.ConnectError,\n error: e,\n message: 'Connect error - Initial connection just failed.',\n });\n // Only make a reconnection attempt if autoReconnect is true!\n // Otherwise, let error be propagated\n if (this.autoReconnect) {\n this.makeAutoReconnectRetry(0, e);\n }\n else {\n throw e;\n }\n }\n return this;\n }\n /** Make a new request to (re)connect to Twitter. */\n async reconnect() {\n if (this.connectionProcessRunning) {\n throw new Error('Connection process is already running.');\n }\n this.connectionProcessRunning = true;\n try {\n let initialConnection = true;\n if (this.req) {\n initialConnection = false;\n this.closeWithoutEmit();\n }\n const { req, res, originalResponse } = await new request_handler_helper_1.default(this.requestData).makeRequestAndResolveWhenReady();\n this.req = req;\n this.res = res;\n this.originalResponse = originalResponse;\n this.emit(initialConnection ? types_1.ETwitterStreamEvent.Connected : types_1.ETwitterStreamEvent.Reconnected);\n this.parser.reset();\n this.initEventsFromRequest();\n }\n finally {\n this.connectionProcessRunning = false;\n }\n }\n async onConnectionError(retryOccurrence = 0) {\n this.unbindTimeouts();\n // Close the request if necessary\n this.closeWithoutEmit();\n // Terminate stream by events if necessary (no auto-reconnect or retries exceeded)\n if (!this.autoReconnect) {\n this.emit(types_1.ETwitterStreamEvent.ConnectionClosed);\n return;\n }\n if (retryOccurrence >= this.autoReconnectRetries) {\n this.emit(types_1.ETwitterStreamEvent.ReconnectLimitExceeded);\n this.emit(types_1.ETwitterStreamEvent.ConnectionClosed);\n return;\n }\n // If all other conditions fails, do a reconnect attempt\n try {\n this.emit(types_1.ETwitterStreamEvent.ReconnectAttempt, retryOccurrence);\n await this.reconnect();\n }\n catch (e) {\n this.emit(types_1.ETwitterStreamEvent.ReconnectError, retryOccurrence);\n this.emit(types_1.ETwitterStreamEvent.Error, {\n type: types_1.ETwitterStreamEvent.ReconnectError,\n error: e,\n message: `Reconnect error - ${retryOccurrence + 1} attempts made yet.`,\n });\n this.makeAutoReconnectRetry(retryOccurrence, e);\n }\n }\n makeAutoReconnectRetry(retryOccurrence, error) {\n const nextRetry = this.nextRetryTimeout(retryOccurrence + 1, error);\n this.retryTimeout = setTimeout(() => {\n this.onConnectionError(retryOccurrence + 1);\n }, nextRetry);\n }\n async *[Symbol.asyncIterator]() {\n const eventCombiner = new TweetStreamEventCombiner_1.default(this);\n try {\n while (true) {\n if (!this.req || this.req.aborted) {\n throw new Error('Connection closed');\n }\n if (eventCombiner.hasStack()) {\n yield* eventCombiner.popStack();\n }\n const { type, payload } = await eventCombiner.nextEvent();\n if (type === 'error') {\n throw payload;\n }\n }\n }\n finally {\n eventCombiner.destroy();\n }\n }\n}\nexports.TweetStream = TweetStream;\nexports.default = TweetStream;\n",
40
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.applyResponseHooks = exports.hasRequestErrorPlugins = void 0;\nconst types_1 = require(\"../types\");\n/* Plugin helpers */\nfunction hasRequestErrorPlugins(client) {\n var _a;\n if (!((_a = client.clientSettings.plugins) === null || _a === void 0 ? void 0 : _a.length)) {\n return false;\n }\n for (const plugin of client.clientSettings.plugins) {\n if (plugin.onRequestError || plugin.onResponseError) {\n return true;\n }\n }\n return false;\n}\nexports.hasRequestErrorPlugins = hasRequestErrorPlugins;\nasync function applyResponseHooks(requestParams, computedParams, requestOptions, error) {\n let override;\n if (error instanceof types_1.ApiRequestError || error instanceof types_1.ApiPartialResponseError) {\n override = await this.applyPluginMethod('onRequestError', {\n client: this,\n url: this.getUrlObjectFromUrlString(requestParams.url),\n params: requestParams,\n computedParams,\n requestOptions,\n error,\n });\n }\n else if (error instanceof types_1.ApiResponseError) {\n override = await this.applyPluginMethod('onResponseError', {\n client: this,\n url: this.getUrlObjectFromUrlString(requestParams.url),\n params: requestParams,\n computedParams,\n requestOptions,\n error,\n });\n }\n if (override && override instanceof types_1.TwitterApiPluginResponseOverride) {\n return override.value;\n }\n return Promise.reject(error);\n}\nexports.applyResponseHooks = applyResponseHooks;\n",
41
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OAuth1Helper = void 0;\nconst crypto = __importStar(require(\"crypto\"));\nclass OAuth1Helper {\n constructor(options) {\n this.nonceLength = 32;\n this.consumerKeys = options.consumerKeys;\n }\n static percentEncode(str) {\n return encodeURIComponent(str)\n .replace(/!/g, '%21')\n .replace(/\\*/g, '%2A')\n .replace(/'/g, '%27')\n .replace(/\\(/g, '%28')\n .replace(/\\)/g, '%29');\n }\n hash(base, key) {\n return crypto\n .createHmac('sha1', key)\n .update(base)\n .digest('base64');\n }\n authorize(request, accessTokens = {}) {\n const oauthInfo = {\n oauth_consumer_key: this.consumerKeys.key,\n oauth_nonce: this.getNonce(),\n oauth_signature_method: 'HMAC-SHA1',\n oauth_timestamp: this.getTimestamp(),\n oauth_version: '1.0',\n };\n if (accessTokens.key !== undefined) {\n oauthInfo.oauth_token = accessTokens.key;\n }\n if (!request.data) {\n request.data = {};\n }\n oauthInfo.oauth_signature = this.getSignature(request, accessTokens.secret, oauthInfo);\n return oauthInfo;\n }\n toHeader(oauthInfo) {\n const sorted = sortObject(oauthInfo);\n let header_value = 'OAuth ';\n for (const element of sorted) {\n if (element.key.indexOf('oauth_') !== 0) {\n continue;\n }\n header_value += OAuth1Helper.percentEncode(element.key) + '=\"' + OAuth1Helper.percentEncode(element.value) + '\",';\n }\n return {\n // Remove the last ,\n Authorization: header_value.slice(0, header_value.length - 1),\n };\n }\n getNonce() {\n const wordCharacters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n let result = '';\n for (let i = 0; i < this.nonceLength; i++) {\n result += wordCharacters[Math.trunc(Math.random() * wordCharacters.length)];\n }\n return result;\n }\n getTimestamp() {\n return Math.trunc(new Date().getTime() / 1000);\n }\n getSignature(request, tokenSecret, oauthInfo) {\n return this.hash(this.getBaseString(request, oauthInfo), this.getSigningKey(tokenSecret));\n }\n getSigningKey(tokenSecret) {\n return OAuth1Helper.percentEncode(this.consumerKeys.secret) + '&' + OAuth1Helper.percentEncode(tokenSecret || '');\n }\n getBaseString(request, oauthInfo) {\n return request.method.toUpperCase() + '&'\n + OAuth1Helper.percentEncode(this.getBaseUrl(request.url)) + '&'\n + OAuth1Helper.percentEncode(this.getParameterString(request, oauthInfo));\n }\n getParameterString(request, oauthInfo) {\n const baseStringData = sortObject(percentEncodeData(mergeObject(oauthInfo, mergeObject(request.data, deParamUrl(request.url)))));\n let dataStr = '';\n for (const { key, value } of baseStringData) {\n // check if the value is an array\n // this means that this key has multiple values\n if (value && Array.isArray(value)) {\n // sort the array first\n value.sort();\n let valString = '';\n // serialize all values for this key: e.g. formkey=formvalue1&formkey=formvalue2\n value.forEach((item, i) => {\n valString += key + '=' + item;\n if (i < value.length) {\n valString += '&';\n }\n });\n dataStr += valString;\n }\n else {\n dataStr += key + '=' + value + '&';\n }\n }\n // Remove the last character\n return dataStr.slice(0, dataStr.length - 1);\n }\n getBaseUrl(url) {\n return url.split('?')[0];\n }\n}\nexports.OAuth1Helper = OAuth1Helper;\nexports.default = OAuth1Helper;\n// Helper functions //\nfunction mergeObject(obj1, obj2) {\n return {\n ...obj1 || {},\n ...obj2 || {},\n };\n}\nfunction sortObject(data) {\n return Object.keys(data)\n .sort()\n .map(key => ({ key, value: data[key] }));\n}\nfunction deParam(string) {\n const split = string.split('&');\n const data = {};\n for (const coupleKeyValue of split) {\n const [key, value = ''] = coupleKeyValue.split('=');\n // check if the key already exists\n // this can occur if the QS part of the url contains duplicate keys like this: ?formkey=formvalue1&formkey=formvalue2\n if (data[key]) {\n // the key exists already\n if (!Array.isArray(data[key])) {\n // replace the value with an array containing the already present value\n data[key] = [data[key]];\n }\n // and add the new found value to it\n data[key].push(decodeURIComponent(value));\n }\n else {\n // it doesn't exist, just put the found value in the data object\n data[key] = decodeURIComponent(value);\n }\n }\n return data;\n}\nfunction deParamUrl(url) {\n const tmp = url.split('?');\n if (tmp.length === 1)\n return {};\n return deParam(tmp[1]);\n}\nfunction percentEncodeData(data) {\n const result = {};\n for (const key in data) {\n let value = data[key];\n // check if the value is an array\n if (value && Array.isArray(value)) {\n value = value.map(v => OAuth1Helper.percentEncode(v));\n }\n else {\n value = OAuth1Helper.percentEncode(value);\n }\n result[OAuth1Helper.percentEncode(key)] = value;\n }\n return result;\n}\n",
42
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FormDataHelper = void 0;\nconst helpers_1 = require(\"../helpers\");\n// This class is partially inspired by https://github.com/form-data/form-data/blob/master/lib/form_data.js\n// All credits to their authors.\nclass FormDataHelper {\n constructor() {\n this._boundary = '';\n this._chunks = [];\n }\n bodyAppend(...values) {\n const allAsBuffer = values.map(val => val instanceof Buffer ? val : Buffer.from(val));\n this._chunks.push(...allAsBuffer);\n }\n append(field, value, contentType) {\n const convertedValue = value instanceof Buffer ? value : value.toString();\n const header = this.getMultipartHeader(field, convertedValue, contentType);\n this.bodyAppend(header, convertedValue, FormDataHelper.LINE_BREAK);\n }\n getHeaders() {\n return {\n 'content-type': 'multipart/form-data; boundary=' + this.getBoundary(),\n };\n }\n /** Length of form-data (including footer length). */\n getLength() {\n return this._chunks.reduce((acc, cur) => acc + cur.length, this.getMultipartFooter().length);\n }\n getBuffer() {\n const allChunks = [...this._chunks, this.getMultipartFooter()];\n const totalBuffer = Buffer.alloc(this.getLength());\n let i = 0;\n for (const chunk of allChunks) {\n for (let j = 0; j < chunk.length; i++, j++) {\n totalBuffer[i] = chunk[j];\n }\n }\n return totalBuffer;\n }\n getBoundary() {\n if (!this._boundary) {\n this.generateBoundary();\n }\n return this._boundary;\n }\n generateBoundary() {\n // This generates a 50 character boundary similar to those used by Firefox.\n let boundary = '--------------------------';\n for (let i = 0; i < 24; i++) {\n boundary += Math.floor(Math.random() * 10).toString(16);\n }\n this._boundary = boundary;\n }\n getMultipartHeader(field, value, contentType) {\n // In this lib no need to guess more the content type, octet stream is ok of buffers\n if (!contentType) {\n contentType = value instanceof Buffer ? FormDataHelper.DEFAULT_CONTENT_TYPE : '';\n }\n const headers = {\n 'Content-Disposition': ['form-data', `name=\"${field}\"`],\n 'Content-Type': contentType,\n };\n let contents = '';\n for (const [prop, header] of Object.entries(headers)) {\n // skip nullish headers.\n if (!header.length) {\n continue;\n }\n contents += prop + ': ' + (0, helpers_1.arrayWrap)(header).join('; ') + FormDataHelper.LINE_BREAK;\n }\n return '--' + this.getBoundary() + FormDataHelper.LINE_BREAK + contents + FormDataHelper.LINE_BREAK;\n }\n getMultipartFooter() {\n if (this._footerChunk) {\n return this._footerChunk;\n }\n return this._footerChunk = Buffer.from('--' + this.getBoundary() + '--' + FormDataHelper.LINE_BREAK);\n }\n}\nexports.FormDataHelper = FormDataHelper;\nFormDataHelper.LINE_BREAK = '\\r\\n';\nFormDataHelper.DEFAULT_CONTENT_TYPE = 'application/octet-stream';\n",
43
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RequestParamHelpers = void 0;\nconst form_data_helper_1 = require(\"./form-data.helper\");\nconst oauth1_helper_1 = __importDefault(require(\"./oauth1.helper\"));\n/* Helpers functions that are specific to this class but do not depends on instance */\nclass RequestParamHelpers {\n static formatQueryToString(query) {\n const formattedQuery = {};\n for (const prop in query) {\n if (typeof query[prop] === 'string') {\n formattedQuery[prop] = query[prop];\n }\n else if (typeof query[prop] !== 'undefined') {\n formattedQuery[prop] = String(query[prop]);\n }\n }\n return formattedQuery;\n }\n static autoDetectBodyType(url) {\n if (url.pathname.startsWith('/2/') || url.pathname.startsWith('/labs/2/')) {\n // oauth2 takes url encoded\n if (url.password.startsWith('/2/oauth2')) {\n return 'url';\n }\n // Twitter API v2 has JSON-encoded requests for everything else\n return 'json';\n }\n if (url.hostname === 'upload.x.com') {\n if (url.pathname === '/1.1/media/upload.json') {\n return 'form-data';\n }\n // json except for media/upload command, that is form-data.\n return 'json';\n }\n const endpoint = url.pathname.split('/1.1/', 2)[1];\n if (this.JSON_1_1_ENDPOINTS.has(endpoint)) {\n return 'json';\n }\n return 'url';\n }\n static addQueryParamsToUrl(url, query) {\n const queryEntries = Object.entries(query);\n if (queryEntries.length) {\n let search = '';\n for (const [key, value] of queryEntries) {\n search += (search.length ? '&' : '?') + `${oauth1_helper_1.default.percentEncode(key)}=${oauth1_helper_1.default.percentEncode(value)}`;\n }\n url.search = search;\n }\n }\n static constructBodyParams(body, headers, mode) {\n if (body instanceof Buffer) {\n return body;\n }\n if (mode === 'json') {\n if (!headers['content-type']) {\n headers['content-type'] = 'application/json;charset=UTF-8';\n }\n return JSON.stringify(body);\n }\n else if (mode === 'url') {\n if (!headers['content-type']) {\n headers['content-type'] = 'application/x-www-form-urlencoded;charset=UTF-8';\n }\n if (Object.keys(body).length) {\n return new URLSearchParams(body)\n .toString()\n .replace(/\\*/g, '%2A'); // URLSearchParams doesnt encode '*', but Twitter wants it encoded.\n }\n return '';\n }\n else if (mode === 'raw') {\n throw new Error('You can only use raw body mode with Buffers. To give a string, use Buffer.from(str).');\n }\n else {\n const form = new form_data_helper_1.FormDataHelper();\n for (const parameter in body) {\n form.append(parameter, body[parameter]);\n }\n if (!headers['content-type']) {\n const formHeaders = form.getHeaders();\n headers['content-type'] = formHeaders['content-type'];\n }\n return form.getBuffer();\n }\n }\n static setBodyLengthHeader(options, body) {\n var _a;\n options.headers = (_a = options.headers) !== null && _a !== void 0 ? _a : {};\n if (typeof body === 'string') {\n options.headers['content-length'] = Buffer.byteLength(body);\n }\n else {\n options.headers['content-length'] = body.length;\n }\n }\n static isOAuthSerializable(item) {\n return !(item instanceof Buffer);\n }\n static mergeQueryAndBodyForOAuth(query, body) {\n const parameters = {};\n for (const prop in query) {\n parameters[prop] = query[prop];\n }\n if (this.isOAuthSerializable(body)) {\n for (const prop in body) {\n const bodyProp = body[prop];\n if (this.isOAuthSerializable(bodyProp)) {\n parameters[prop] = typeof bodyProp === 'object' && bodyProp !== null && 'toString' in bodyProp\n ? bodyProp.toString()\n : bodyProp;\n }\n }\n }\n return parameters;\n }\n static moveUrlQueryParamsIntoObject(url, query) {\n for (const [param, value] of url.searchParams) {\n query[param] = value;\n }\n // Remove the query string\n url.search = '';\n return url;\n }\n /**\n * Replace URL parameters available in pathname, like `:id`, with data given in `parameters`:\n * `https://x.com/:id.json` + `{ id: '20' }` => `https://x.com/20.json`\n */\n static applyRequestParametersToUrl(url, parameters) {\n url.pathname = url.pathname.replace(/:([A-Z_-]+)/ig, (fullMatch, paramName) => {\n if (parameters[paramName] !== undefined) {\n return String(parameters[paramName]);\n }\n return fullMatch;\n });\n return url;\n }\n}\nexports.RequestParamHelpers = RequestParamHelpers;\nRequestParamHelpers.JSON_1_1_ENDPOINTS = new Set([\n 'direct_messages/events/new.json',\n 'direct_messages/welcome_messages/new.json',\n 'direct_messages/welcome_messages/rules/new.json',\n 'media/metadata/create.json',\n 'collections/entries/curate.json',\n]);\nexports.default = RequestParamHelpers;\n",
44
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OAuth2Helper = void 0;\nconst crypto = __importStar(require(\"crypto\"));\nclass OAuth2Helper {\n static getCodeVerifier() {\n return this.generateRandomString(128);\n }\n static getCodeChallengeFromVerifier(verifier) {\n return this.escapeBase64Url(crypto\n .createHash('sha256')\n .update(verifier)\n .digest('base64'));\n }\n static getAuthHeader(clientId, clientSecret) {\n const key = encodeURIComponent(clientId) + ':' + encodeURIComponent(clientSecret);\n return Buffer.from(key).toString('base64');\n }\n static generateRandomString(length) {\n let text = '';\n const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n for (let i = 0; i < length; i++) {\n text += possible[Math.floor(Math.random() * possible.length)];\n }\n return text;\n }\n static escapeBase64Url(string) {\n return string.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n }\n}\nexports.OAuth2Helper = OAuth2Helper;\n",
45
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ClientRequestMaker = void 0;\nconst types_1 = require(\"../types\");\nconst TweetStream_1 = __importDefault(require(\"../stream/TweetStream\"));\nconst helpers_1 = require(\"../plugins/helpers\");\nconst helpers_2 = require(\"../helpers\");\nconst oauth1_helper_1 = __importDefault(require(\"./oauth1.helper\"));\nconst request_handler_helper_1 = __importDefault(require(\"./request-handler.helper\"));\nconst request_param_helper_1 = __importDefault(require(\"./request-param.helper\"));\nconst oauth2_helper_1 = require(\"./oauth2.helper\");\nclass ClientRequestMaker {\n constructor(settings) {\n this.rateLimits = {};\n this.clientSettings = {};\n if (settings) {\n this.clientSettings = settings;\n }\n }\n /** @deprecated - Switch to `@twitter-api-v2/plugin-rate-limit` */\n getRateLimits() {\n return this.rateLimits;\n }\n saveRateLimit(originalUrl, rateLimit) {\n this.rateLimits[originalUrl] = rateLimit;\n }\n /** Send a new request and returns a wrapped `Promise<TwitterResponse<T>`. */\n async send(requestParams) {\n var _a, _b, _c, _d, _e;\n // Pre-request config hooks\n if ((_a = this.clientSettings.plugins) === null || _a === void 0 ? void 0 : _a.length) {\n const possibleResponse = await this.applyPreRequestConfigHooks(requestParams);\n if (possibleResponse) {\n return possibleResponse;\n }\n }\n const args = this.getHttpRequestArgs(requestParams);\n const options = {\n method: args.method,\n headers: args.headers,\n timeout: requestParams.timeout,\n agent: this.clientSettings.httpAgent,\n };\n const enableRateLimitSave = requestParams.enableRateLimitSave !== false;\n if (args.body) {\n request_param_helper_1.default.setBodyLengthHeader(options, args.body);\n }\n // Pre-request hooks\n if ((_b = this.clientSettings.plugins) === null || _b === void 0 ? void 0 : _b.length) {\n await this.applyPreRequestHooks(requestParams, args, options);\n }\n let request = new request_handler_helper_1.default({\n url: args.url,\n options,\n body: args.body,\n rateLimitSaver: enableRateLimitSave ? this.saveRateLimit.bind(this, args.rawUrl) : undefined,\n requestEventDebugHandler: requestParams.requestEventDebugHandler,\n compression: (_d = (_c = requestParams.compression) !== null && _c !== void 0 ? _c : this.clientSettings.compression) !== null && _d !== void 0 ? _d : true,\n forceParseMode: requestParams.forceParseMode,\n })\n .makeRequest();\n if ((0, helpers_1.hasRequestErrorPlugins)(this)) {\n request = this.applyResponseErrorHooks(requestParams, args, options, request);\n }\n const response = await request;\n // Post-request hooks\n if ((_e = this.clientSettings.plugins) === null || _e === void 0 ? void 0 : _e.length) {\n const responseOverride = await this.applyPostRequestHooks(requestParams, args, options, response);\n if (responseOverride) {\n return responseOverride.value;\n }\n }\n return response;\n }\n sendStream(requestParams) {\n var _a, _b;\n // Pre-request hooks\n if (this.clientSettings.plugins) {\n this.applyPreStreamRequestConfigHooks(requestParams);\n }\n const args = this.getHttpRequestArgs(requestParams);\n const options = {\n method: args.method,\n headers: args.headers,\n agent: this.clientSettings.httpAgent,\n };\n const enableRateLimitSave = requestParams.enableRateLimitSave !== false;\n const enableAutoConnect = requestParams.autoConnect !== false;\n if (args.body) {\n request_param_helper_1.default.setBodyLengthHeader(options, args.body);\n }\n const requestData = {\n url: args.url,\n options,\n body: args.body,\n rateLimitSaver: enableRateLimitSave ? this.saveRateLimit.bind(this, args.rawUrl) : undefined,\n payloadIsError: requestParams.payloadIsError,\n compression: (_b = (_a = requestParams.compression) !== null && _a !== void 0 ? _a : this.clientSettings.compression) !== null && _b !== void 0 ? _b : true,\n };\n const stream = new TweetStream_1.default(requestData);\n if (!enableAutoConnect) {\n return stream;\n }\n return stream.connect();\n }\n /* Token helpers */\n initializeToken(token) {\n if (typeof token === 'string') {\n this.bearerToken = token;\n }\n else if (typeof token === 'object' && 'appKey' in token) {\n this.consumerToken = token.appKey;\n this.consumerSecret = token.appSecret;\n if (token.accessToken && token.accessSecret) {\n this.accessToken = token.accessToken;\n this.accessSecret = token.accessSecret;\n }\n this._oauth = this.buildOAuth();\n }\n else if (typeof token === 'object' && 'username' in token) {\n const key = encodeURIComponent(token.username) + ':' + encodeURIComponent(token.password);\n this.basicToken = Buffer.from(key).toString('base64');\n }\n else if (typeof token === 'object' && 'clientId' in token) {\n this.clientId = token.clientId;\n this.clientSecret = token.clientSecret;\n }\n }\n getActiveTokens() {\n if (this.bearerToken) {\n return {\n type: 'oauth2',\n bearerToken: this.bearerToken,\n };\n }\n else if (this.basicToken) {\n return {\n type: 'basic',\n token: this.basicToken,\n };\n }\n else if (this.consumerSecret && this._oauth) {\n return {\n type: 'oauth-1.0a',\n appKey: this.consumerToken,\n appSecret: this.consumerSecret,\n accessToken: this.accessToken,\n accessSecret: this.accessSecret,\n };\n }\n else if (this.clientId) {\n return {\n type: 'oauth2-user',\n clientId: this.clientId,\n };\n }\n return { type: 'none' };\n }\n buildOAuth() {\n if (!this.consumerSecret || !this.consumerToken)\n throw new Error('Invalid consumer tokens');\n return new oauth1_helper_1.default({\n consumerKeys: { key: this.consumerToken, secret: this.consumerSecret },\n });\n }\n getOAuthAccessTokens() {\n if (!this.accessSecret || !this.accessToken)\n return;\n return {\n key: this.accessToken,\n secret: this.accessSecret,\n };\n }\n /* Plugin helpers */\n getPlugins() {\n var _a;\n return (_a = this.clientSettings.plugins) !== null && _a !== void 0 ? _a : [];\n }\n hasPlugins() {\n var _a;\n return !!((_a = this.clientSettings.plugins) === null || _a === void 0 ? void 0 : _a.length);\n }\n async applyPluginMethod(method, args) {\n var _a;\n let returnValue;\n for (const plugin of this.getPlugins()) {\n const value = await ((_a = plugin[method]) === null || _a === void 0 ? void 0 : _a.call(plugin, args));\n if (value && value instanceof types_1.TwitterApiPluginResponseOverride) {\n returnValue = value;\n }\n }\n return returnValue;\n }\n /* Request helpers */\n writeAuthHeaders({ headers, bodyInSignature, url, method, query, body }) {\n headers = { ...headers };\n if (this.bearerToken) {\n headers.Authorization = 'Bearer ' + this.bearerToken;\n }\n else if (this.basicToken) {\n // Basic auth, to request a bearer token\n headers.Authorization = 'Basic ' + this.basicToken;\n }\n else if (this.clientId && this.clientSecret) {\n // Basic auth with clientId + clientSecret\n headers.Authorization = 'Basic ' + oauth2_helper_1.OAuth2Helper.getAuthHeader(this.clientId, this.clientSecret);\n }\n else if (this.consumerSecret && this._oauth) {\n // Merge query and body\n const data = bodyInSignature ? request_param_helper_1.default.mergeQueryAndBodyForOAuth(query, body) : query;\n const auth = this._oauth.authorize({\n url: url.toString(),\n method,\n data,\n }, this.getOAuthAccessTokens());\n headers = { ...headers, ...this._oauth.toHeader(auth) };\n }\n return headers;\n }\n getUrlObjectFromUrlString(url) {\n // Add protocol to URL if needed\n if (!url.startsWith('http')) {\n url = 'https://' + url;\n }\n // Convert URL to object that will receive all URL modifications\n return new URL(url);\n }\n getHttpRequestArgs({ url: stringUrl, method, query: rawQuery = {}, body: rawBody = {}, headers, forceBodyMode, enableAuth, params, }) {\n let body = undefined;\n method = method.toUpperCase();\n headers = headers !== null && headers !== void 0 ? headers : {};\n // Add user agent header (Twitter recommends it)\n if (!headers['x-user-agent']) {\n headers['x-user-agent'] = 'Node.twitter-api-v2';\n }\n const url = this.getUrlObjectFromUrlString(stringUrl);\n // URL without query string to save as endpoint name\n const rawUrl = url.origin + url.pathname;\n // Apply URL parameters\n if (params) {\n request_param_helper_1.default.applyRequestParametersToUrl(url, params);\n }\n // Build a URL without anything in QS, and QSP in query\n const query = request_param_helper_1.default.formatQueryToString(rawQuery);\n request_param_helper_1.default.moveUrlQueryParamsIntoObject(url, query);\n // Delete undefined parameters\n if (!(rawBody instanceof Buffer)) {\n (0, helpers_2.trimUndefinedProperties)(rawBody);\n }\n // OAuth signature should not include parameters when using multipart.\n const bodyType = forceBodyMode !== null && forceBodyMode !== void 0 ? forceBodyMode : request_param_helper_1.default.autoDetectBodyType(url);\n // If undefined or true, enable auth by headers\n if (enableAuth !== false) {\n // OAuth needs body signature only if body is URL encoded.\n const bodyInSignature = ClientRequestMaker.BODY_METHODS.has(method) && bodyType === 'url';\n headers = this.writeAuthHeaders({ headers, bodyInSignature, method, query, url, body: rawBody });\n }\n if (ClientRequestMaker.BODY_METHODS.has(method)) {\n body = request_param_helper_1.default.constructBodyParams(rawBody, headers, bodyType) || undefined;\n }\n request_param_helper_1.default.addQueryParamsToUrl(url, query);\n return {\n rawUrl,\n url,\n method,\n headers,\n body,\n };\n }\n /* Plugin helpers */\n async applyPreRequestConfigHooks(requestParams) {\n var _a;\n const url = this.getUrlObjectFromUrlString(requestParams.url);\n for (const plugin of this.getPlugins()) {\n const result = await ((_a = plugin.onBeforeRequestConfig) === null || _a === void 0 ? void 0 : _a.call(plugin, {\n client: this,\n url,\n params: requestParams,\n }));\n if (result) {\n return result;\n }\n }\n }\n applyPreStreamRequestConfigHooks(requestParams) {\n var _a;\n const url = this.getUrlObjectFromUrlString(requestParams.url);\n for (const plugin of this.getPlugins()) {\n (_a = plugin.onBeforeStreamRequestConfig) === null || _a === void 0 ? void 0 : _a.call(plugin, {\n client: this,\n url,\n params: requestParams,\n });\n }\n }\n async applyPreRequestHooks(requestParams, computedParams, requestOptions) {\n await this.applyPluginMethod('onBeforeRequest', {\n client: this,\n url: this.getUrlObjectFromUrlString(requestParams.url),\n params: requestParams,\n computedParams,\n requestOptions,\n });\n }\n async applyPostRequestHooks(requestParams, computedParams, requestOptions, response) {\n return await this.applyPluginMethod('onAfterRequest', {\n client: this,\n url: this.getUrlObjectFromUrlString(requestParams.url),\n params: requestParams,\n computedParams,\n requestOptions,\n response,\n });\n }\n applyResponseErrorHooks(requestParams, computedParams, requestOptions, promise) {\n return promise.catch(helpers_1.applyResponseHooks.bind(this, requestParams, computedParams, requestOptions));\n }\n}\nexports.ClientRequestMaker = ClientRequestMaker;\nClientRequestMaker.BODY_METHODS = new Set(['POST', 'PUT', 'PATCH']);\n",
46
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst request_maker_mixin_1 = require(\"./client-mixins/request-maker.mixin\");\nconst helpers_1 = require(\"./helpers\");\nconst globals_1 = require(\"./globals\");\n/**\n * Base class for Twitter instances\n */\nclass TwitterApiBase {\n constructor(token, settings = {}) {\n this._currentUser = null;\n this._currentUserV2 = null;\n if (token instanceof TwitterApiBase) {\n this._requestMaker = token._requestMaker;\n }\n else {\n this._requestMaker = new request_maker_mixin_1.ClientRequestMaker(settings);\n this._requestMaker.initializeToken(token);\n }\n }\n /* Prefix/Token handling */\n setPrefix(prefix) {\n this._prefix = prefix;\n }\n cloneWithPrefix(prefix) {\n const clone = this.constructor(this);\n clone.setPrefix(prefix);\n return clone;\n }\n getActiveTokens() {\n return this._requestMaker.getActiveTokens();\n }\n /* Rate limit cache / Plugins */\n getPlugins() {\n return this._requestMaker.getPlugins();\n }\n getPluginOfType(type) {\n return this.getPlugins().find(plugin => plugin instanceof type);\n }\n /**\n * @deprecated - Migrate to plugin `@twitter-api-v2/plugin-rate-limit`\n *\n * Tells if you hit the Twitter rate limit for {endpoint}.\n * (local data only, this should not ask anything to Twitter)\n */\n hasHitRateLimit(endpoint) {\n var _a;\n if (this.isRateLimitStatusObsolete(endpoint)) {\n return false;\n }\n return ((_a = this.getLastRateLimitStatus(endpoint)) === null || _a === void 0 ? void 0 : _a.remaining) === 0;\n }\n /**\n * @deprecated - Migrate to plugin `@twitter-api-v2/plugin-rate-limit`\n *\n * Tells if you hit the returned Twitter rate limit for {endpoint} has expired.\n * If client has no saved rate limit data for {endpoint}, this will gives you `true`.\n */\n isRateLimitStatusObsolete(endpoint) {\n const rateLimit = this.getLastRateLimitStatus(endpoint);\n if (rateLimit === undefined) {\n return true;\n }\n // Timestamps are exprimed in seconds, JS works with ms\n return (rateLimit.reset * 1000) < Date.now();\n }\n /**\n * @deprecated - Migrate to plugin `@twitter-api-v2/plugin-rate-limit`\n *\n * Get the last obtained Twitter rate limit information for {endpoint}.\n * (local data only, this should not ask anything to Twitter)\n */\n getLastRateLimitStatus(endpoint) {\n const endpointWithPrefix = endpoint.match(/^https?:\\/\\//) ? endpoint : (this._prefix + endpoint);\n return this._requestMaker.getRateLimits()[endpointWithPrefix];\n }\n /* Current user cache */\n /** Get cached current user. */\n getCurrentUserObject(forceFetch = false) {\n if (!forceFetch && this._currentUser) {\n if (this._currentUser.value) {\n return Promise.resolve(this._currentUser.value);\n }\n return this._currentUser.promise;\n }\n this._currentUser = (0, helpers_1.sharedPromise)(() => this.get('account/verify_credentials.json', { tweet_mode: 'extended' }, { prefix: globals_1.API_V1_1_PREFIX }));\n return this._currentUser.promise;\n }\n /**\n * Get cached current user from v2 API.\n * This can only be the slimest available `UserV2` object, with only `id`, `name` and `username` properties defined.\n *\n * To get a customized `UserV2Result`, use `.v2.me()`\n *\n * OAuth2 scopes: `tweet.read` & `users.read`\n */\n getCurrentUserV2Object(forceFetch = false) {\n if (!forceFetch && this._currentUserV2) {\n if (this._currentUserV2.value) {\n return Promise.resolve(this._currentUserV2.value);\n }\n return this._currentUserV2.promise;\n }\n this._currentUserV2 = (0, helpers_1.sharedPromise)(() => this.get('users/me', undefined, { prefix: globals_1.API_V2_PREFIX }));\n return this._currentUserV2.promise;\n }\n async get(url, query = {}, { fullResponse, prefix = this._prefix, ...rest } = {}) {\n if (prefix)\n url = prefix + url;\n const resp = await this._requestMaker.send({\n url,\n method: 'GET',\n query,\n ...rest,\n });\n return fullResponse ? resp : resp.data;\n }\n async delete(url, query = {}, { fullResponse, prefix = this._prefix, ...rest } = {}) {\n if (prefix)\n url = prefix + url;\n const resp = await this._requestMaker.send({\n url,\n method: 'DELETE',\n query,\n ...rest,\n });\n return fullResponse ? resp : resp.data;\n }\n async post(url, body, { fullResponse, prefix = this._prefix, ...rest } = {}) {\n if (prefix)\n url = prefix + url;\n const resp = await this._requestMaker.send({\n url,\n method: 'POST',\n body,\n ...rest,\n });\n return fullResponse ? resp : resp.data;\n }\n async put(url, body, { fullResponse, prefix = this._prefix, ...rest } = {}) {\n if (prefix)\n url = prefix + url;\n const resp = await this._requestMaker.send({\n url,\n method: 'PUT',\n body,\n ...rest,\n });\n return fullResponse ? resp : resp.data;\n }\n async patch(url, body, { fullResponse, prefix = this._prefix, ...rest } = {}) {\n if (prefix)\n url = prefix + url;\n const resp = await this._requestMaker.send({\n url,\n method: 'PATCH',\n body,\n ...rest,\n });\n return fullResponse ? resp : resp.data;\n }\n getStream(url, query, { prefix = this._prefix, ...rest } = {}) {\n return this._requestMaker.sendStream({\n url: prefix ? prefix + url : url,\n method: 'GET',\n query,\n ...rest,\n });\n }\n postStream(url, body, { prefix = this._prefix, ...rest } = {}) {\n return this._requestMaker.sendStream({\n url: prefix ? prefix + url : url,\n method: 'POST',\n body,\n ...rest,\n });\n }\n}\nexports.default = TwitterApiBase;\n",
47
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst client_base_1 = __importDefault(require(\"./client.base\"));\n/**\n * Base subclient for every v1 and v2 client.\n */\nclass TwitterApiSubClient extends client_base_1.default {\n constructor(instance) {\n if (!(instance instanceof client_base_1.default)) {\n throw new Error('You must instance SubTwitterApi instance from existing TwitterApi instance.');\n }\n super(instance);\n }\n}\nexports.default = TwitterApiSubClient;\n",
48
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UserFavoritesV1Paginator = exports.ListTimelineV1Paginator = exports.UserTimelineV1Paginator = exports.MentionTimelineV1Paginator = exports.HomeTimelineV1Paginator = void 0;\nconst TwitterPaginator_1 = __importDefault(require(\"./TwitterPaginator\"));\n/** A generic TwitterPaginator able to consume TweetV1 timelines. */\nclass TweetTimelineV1Paginator extends TwitterPaginator_1.default {\n constructor() {\n super(...arguments);\n this.hasFinishedFetch = false;\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.push(...result);\n // HINT: This is an approximation, as \"end\" of pagination cannot be safely determined without cursors.\n this.hasFinishedFetch = result.length === 0;\n }\n }\n getNextQueryParams(maxResults) {\n const latestId = BigInt(this._realData[this._realData.length - 1].id_str);\n return {\n ...this.injectQueryParams(maxResults),\n max_id: (latestId - BigInt(1)).toString(),\n };\n }\n getPageLengthFromRequest(result) {\n return result.data.length;\n }\n isFetchLastOver(result) {\n return !result.data.length;\n }\n canFetchNextPage(result) {\n return result.length > 0;\n }\n getItemArray() {\n return this.tweets;\n }\n /**\n * Tweets returned by paginator.\n */\n get tweets() {\n return this._realData;\n }\n get done() {\n return super.done || this.hasFinishedFetch;\n }\n}\n// Timelines\n// Home\nclass HomeTimelineV1Paginator extends TweetTimelineV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'statuses/home_timeline.json';\n }\n}\nexports.HomeTimelineV1Paginator = HomeTimelineV1Paginator;\n// Mention\nclass MentionTimelineV1Paginator extends TweetTimelineV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'statuses/mentions_timeline.json';\n }\n}\nexports.MentionTimelineV1Paginator = MentionTimelineV1Paginator;\n// User\nclass UserTimelineV1Paginator extends TweetTimelineV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'statuses/user_timeline.json';\n }\n}\nexports.UserTimelineV1Paginator = UserTimelineV1Paginator;\n// Lists\nclass ListTimelineV1Paginator extends TweetTimelineV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'lists/statuses.json';\n }\n}\nexports.ListTimelineV1Paginator = ListTimelineV1Paginator;\n// Favorites\nclass UserFavoritesV1Paginator extends TweetTimelineV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'favorites/list.json';\n }\n}\nexports.UserFavoritesV1Paginator = UserFavoritesV1Paginator;\n",
49
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MuteUserIdsV1Paginator = exports.MuteUserListV1Paginator = void 0;\nconst paginator_v1_1 = require(\"./paginator.v1\");\nclass MuteUserListV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'mutes/users/list.json';\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.users.push(...result.users);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.users.length;\n }\n getItemArray() {\n return this.users;\n }\n /**\n * Users returned by paginator.\n */\n get users() {\n return this._realData.users;\n }\n}\nexports.MuteUserListV1Paginator = MuteUserListV1Paginator;\nclass MuteUserIdsV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'mutes/users/ids.json';\n this._maxResultsWhenFetchLast = 5000;\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.ids.push(...result.ids);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.ids.length;\n }\n getItemArray() {\n return this.ids;\n }\n /**\n * Users IDs returned by paginator.\n */\n get ids() {\n return this._realData.ids;\n }\n}\nexports.MuteUserIdsV1Paginator = MuteUserIdsV1Paginator;\n",
50
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UserFollowerIdsV1Paginator = exports.UserFollowerListV1Paginator = void 0;\nconst paginator_v1_1 = require(\"./paginator.v1\");\nclass UserFollowerListV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'followers/list.json';\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.users.push(...result.users);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.users.length;\n }\n getItemArray() {\n return this.users;\n }\n /**\n * Users returned by paginator.\n */\n get users() {\n return this._realData.users;\n }\n}\nexports.UserFollowerListV1Paginator = UserFollowerListV1Paginator;\nclass UserFollowerIdsV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'followers/ids.json';\n this._maxResultsWhenFetchLast = 5000;\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.ids.push(...result.ids);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.ids.length;\n }\n getItemArray() {\n return this.ids;\n }\n /**\n * Users IDs returned by paginator.\n */\n get ids() {\n return this._realData.ids;\n }\n}\nexports.UserFollowerIdsV1Paginator = UserFollowerIdsV1Paginator;\n",
51
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UserFollowersIdsV1Paginator = exports.UserFriendListV1Paginator = void 0;\nconst paginator_v1_1 = require(\"./paginator.v1\");\nclass UserFriendListV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'friends/list.json';\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.users.push(...result.users);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.users.length;\n }\n getItemArray() {\n return this.users;\n }\n /**\n * Users returned by paginator.\n */\n get users() {\n return this._realData.users;\n }\n}\nexports.UserFriendListV1Paginator = UserFriendListV1Paginator;\nclass UserFollowersIdsV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'friends/ids.json';\n this._maxResultsWhenFetchLast = 5000;\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.ids.push(...result.ids);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.ids.length;\n }\n getItemArray() {\n return this.ids;\n }\n /**\n * Users IDs returned by paginator.\n */\n get ids() {\n return this._realData.ids;\n }\n}\nexports.UserFollowersIdsV1Paginator = UserFollowersIdsV1Paginator;\n",
52
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FriendshipsOutgoingV1Paginator = exports.FriendshipsIncomingV1Paginator = exports.UserSearchV1Paginator = void 0;\nconst TwitterPaginator_1 = __importDefault(require(\"./TwitterPaginator\"));\nconst paginator_v1_1 = require(\"./paginator.v1\");\n/** A generic TwitterPaginator able to consume TweetV1 timelines. */\nclass UserSearchV1Paginator extends TwitterPaginator_1.default {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/search.json';\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.push(...result);\n }\n }\n getNextQueryParams(maxResults) {\n var _a;\n const previousPage = Number((_a = this._queryParams.page) !== null && _a !== void 0 ? _a : '1');\n return {\n ...this._queryParams,\n page: previousPage + 1,\n ...maxResults ? { count: maxResults } : {},\n };\n }\n getPageLengthFromRequest(result) {\n return result.data.length;\n }\n isFetchLastOver(result) {\n return !result.data.length;\n }\n canFetchNextPage(result) {\n return result.length > 0;\n }\n getItemArray() {\n return this.users;\n }\n /**\n * Users returned by paginator.\n */\n get users() {\n return this._realData;\n }\n}\nexports.UserSearchV1Paginator = UserSearchV1Paginator;\nclass FriendshipsIncomingV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'friendships/incoming.json';\n this._maxResultsWhenFetchLast = 5000;\n }\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.ids.push(...result.ids);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.ids.length;\n }\n getItemArray() {\n return this.ids;\n }\n /**\n * Users IDs returned by paginator.\n */\n get ids() {\n return this._realData.ids;\n }\n}\nexports.FriendshipsIncomingV1Paginator = FriendshipsIncomingV1Paginator;\nclass FriendshipsOutgoingV1Paginator extends FriendshipsIncomingV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'friendships/outgoing.json';\n }\n}\nexports.FriendshipsOutgoingV1Paginator = FriendshipsOutgoingV1Paginator;\n",
53
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListSubscribersV1Paginator = exports.ListMembersV1Paginator = exports.ListSubscriptionsV1Paginator = exports.ListOwnershipsV1Paginator = exports.ListMembershipsV1Paginator = void 0;\nconst paginator_v1_1 = require(\"./paginator.v1\");\nclass ListListsV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.lists.push(...result.lists);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.lists.length;\n }\n getItemArray() {\n return this.lists;\n }\n /**\n * Lists returned by paginator.\n */\n get lists() {\n return this._realData.lists;\n }\n}\nclass ListMembershipsV1Paginator extends ListListsV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'lists/memberships.json';\n }\n}\nexports.ListMembershipsV1Paginator = ListMembershipsV1Paginator;\nclass ListOwnershipsV1Paginator extends ListListsV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'lists/ownerships.json';\n }\n}\nexports.ListOwnershipsV1Paginator = ListOwnershipsV1Paginator;\nclass ListSubscriptionsV1Paginator extends ListListsV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'lists/subscriptions.json';\n }\n}\nexports.ListSubscriptionsV1Paginator = ListSubscriptionsV1Paginator;\nclass ListUsersV1Paginator extends paginator_v1_1.CursoredV1Paginator {\n refreshInstanceFromResult(response, isNextPage) {\n const result = response.data;\n this._rateLimit = response.rateLimit;\n if (isNextPage) {\n this._realData.users.push(...result.users);\n this._realData.next_cursor = result.next_cursor;\n }\n }\n getPageLengthFromRequest(result) {\n return result.data.users.length;\n }\n getItemArray() {\n return this.users;\n }\n /**\n * Users returned by paginator.\n */\n get users() {\n return this._realData.users;\n }\n}\nclass ListMembersV1Paginator extends ListUsersV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'lists/members.json';\n }\n}\nexports.ListMembersV1Paginator = ListMembersV1Paginator;\nclass ListSubscribersV1Paginator extends ListUsersV1Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'lists/subscribers.json';\n }\n}\nexports.ListSubscribersV1Paginator = ListSubscribersV1Paginator;\n",
54
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst client_subclient_1 = __importDefault(require(\"../client.subclient\"));\nconst globals_1 = require(\"../globals\");\nconst helpers_1 = require(\"../helpers\");\nconst client_v1_1 = __importDefault(require(\"../v1/client.v1\"));\nconst tweet_paginator_v1_1 = require(\"../paginators/tweet.paginator.v1\");\nconst mutes_paginator_v1_1 = require(\"../paginators/mutes.paginator.v1\");\nconst followers_paginator_v1_1 = require(\"../paginators/followers.paginator.v1\");\nconst friends_paginator_v1_1 = require(\"../paginators/friends.paginator.v1\");\nconst user_paginator_v1_1 = require(\"../paginators/user.paginator.v1\");\nconst list_paginator_v1_1 = require(\"../paginators/list.paginator.v1\");\n/**\n * Base Twitter v1 client with only read right.\n */\nclass TwitterApiv1ReadOnly extends client_subclient_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_V1_1_PREFIX;\n }\n /* Tweets */\n /**\n * Returns a single Tweet, specified by the id parameter. The Tweet's author will also be embedded within the Tweet.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/get-statuses-show-id\n */\n singleTweet(tweetId, options = {}) {\n return this.get('statuses/show.json', { tweet_mode: 'extended', id: tweetId, ...options });\n }\n tweets(ids, options = {}) {\n return this.post('statuses/lookup.json', { tweet_mode: 'extended', id: ids, ...options });\n }\n /**\n * Returns a single Tweet, specified by either a Tweet web URL or the Tweet ID, in an oEmbed-compatible format.\n * The returned HTML snippet will be automatically recognized as an Embedded Tweet when Twitter's widget JavaScript is included on the page.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/get-statuses-oembed\n */\n oembedTweet(tweetId, options = {}) {\n return this.get('oembed', {\n url: `https://x.com/i/statuses/${tweetId}`,\n ...options,\n }, { prefix: 'https://publish.x.com/' });\n }\n /* Tweets timelines */\n /**\n * Returns a collection of the most recent Tweets and Retweets posted by the authenticating user and the users they follow.\n * The home timeline is central to how most users interact with the Twitter service.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/timelines/api-reference/get-statuses-home_timeline\n */\n async homeTimeline(options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n ...options,\n };\n const initialRq = await this.get('statuses/home_timeline.json', queryParams, { fullResponse: true });\n return new tweet_paginator_v1_1.HomeTimelineV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns the 20 most recent mentions (Tweets containing a users's @screen_name) for the authenticating user.\n * The timeline returned is the equivalent of the one seen when you view your mentions on x.com.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/timelines/api-reference/get-statuses-mentions_timeline\n */\n async mentionTimeline(options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n ...options,\n };\n const initialRq = await this.get('statuses/mentions_timeline.json', queryParams, { fullResponse: true });\n return new tweet_paginator_v1_1.MentionTimelineV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns a collection of the most recent Tweets posted by the user indicated by the user_id parameters.\n * User timelines belonging to protected users may only be requested when the authenticated user either \"owns\" the timeline or is an approved follower of the owner.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/timelines/api-reference/get-statuses-user_timeline\n */\n async userTimeline(userId, options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n user_id: userId,\n ...options,\n };\n const initialRq = await this.get('statuses/user_timeline.json', queryParams, { fullResponse: true });\n return new tweet_paginator_v1_1.UserTimelineV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns a collection of the most recent Tweets posted by the user indicated by the screen_name parameters.\n * User timelines belonging to protected users may only be requested when the authenticated user either \"owns\" the timeline or is an approved follower of the owner.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/timelines/api-reference/get-statuses-user_timeline\n */\n async userTimelineByUsername(username, options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n screen_name: username,\n ...options,\n };\n const initialRq = await this.get('statuses/user_timeline.json', queryParams, { fullResponse: true });\n return new tweet_paginator_v1_1.UserTimelineV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns the most recent Tweets liked by the authenticating or specified user, 20 tweets by default.\n * Note: favorites are now known as likes.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/get-favorites-list\n */\n async favoriteTimeline(userId, options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n user_id: userId,\n ...options,\n };\n const initialRq = await this.get('favorites/list.json', queryParams, { fullResponse: true });\n return new tweet_paginator_v1_1.UserFavoritesV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns the most recent Tweets liked by the authenticating or specified user, 20 tweets by default.\n * Note: favorites are now known as likes.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/get-favorites-list\n */\n async favoriteTimelineByUsername(username, options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n screen_name: username,\n ...options,\n };\n const initialRq = await this.get('favorites/list.json', queryParams, { fullResponse: true });\n return new tweet_paginator_v1_1.UserFavoritesV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /* Users */\n /**\n * Returns a variety of information about the user specified by the required user_id or screen_name parameter.\n * The author's most recent Tweet will be returned inline when possible.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-users-show\n */\n user(user) {\n return this.get('users/show.json', { tweet_mode: 'extended', ...user });\n }\n /**\n * Returns fully-hydrated user objects for up to 100 users per request,\n * as specified by comma-separated values passed to the user_id and/or screen_name parameters.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-users-lookup\n */\n users(query) {\n return this.get('users/lookup.json', { tweet_mode: 'extended', ...query });\n }\n /**\n * Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful;\n * returns a 401 status code and an error message if not.\n * Use this method to test if supplied user credentials are valid.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/get-account-verify_credentials\n */\n verifyCredentials(options = {}) {\n return this.get('account/verify_credentials.json', options);\n }\n /**\n * Returns an array of user objects the authenticating user has muted.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/mute-block-report-users/api-reference/get-mutes-users-list\n */\n async listMutedUsers(options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n ...options,\n };\n const initialRq = await this.get('mutes/users/list.json', queryParams, { fullResponse: true });\n return new mutes_paginator_v1_1.MuteUserListV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns an array of numeric user ids the authenticating user has muted.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/mute-block-report-users/api-reference/get-mutes-users-ids\n */\n async listMutedUserIds(options = {}) {\n const queryParams = {\n stringify_ids: true,\n ...options,\n };\n const initialRq = await this.get('mutes/users/ids.json', queryParams, { fullResponse: true });\n return new mutes_paginator_v1_1.MuteUserIdsV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns an array of user objects of friends of the specified user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-friends-list\n */\n async userFriendList(options = {}) {\n const queryParams = {\n ...options,\n };\n const initialRq = await this.get('friends/list.json', queryParams, { fullResponse: true });\n return new friends_paginator_v1_1.UserFriendListV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns an array of user objects of followers of the specified user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-followers-list\n */\n async userFollowerList(options = {}) {\n const queryParams = {\n ...options,\n };\n const initialRq = await this.get('followers/list.json', queryParams, { fullResponse: true });\n return new followers_paginator_v1_1.UserFollowerListV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns an array of numeric user ids of followers of the specified user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-followers-ids\n */\n async userFollowerIds(options = {}) {\n const queryParams = {\n stringify_ids: true,\n ...options,\n };\n const initialRq = await this.get('followers/ids.json', queryParams, { fullResponse: true });\n return new followers_paginator_v1_1.UserFollowerIdsV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns an array of numeric user ids of friends of the specified user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-friends-ids\n */\n async userFollowingIds(options = {}) {\n const queryParams = {\n stringify_ids: true,\n ...options,\n };\n const initialRq = await this.get('friends/ids.json', queryParams, { fullResponse: true });\n return new friends_paginator_v1_1.UserFollowersIdsV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Provides a simple, relevance-based search interface to public user accounts on Twitter.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-users-search\n */\n async searchUsers(query, options = {}) {\n const queryParams = {\n q: query,\n tweet_mode: 'extended',\n page: 1,\n ...options,\n };\n const initialRq = await this.get('users/search.json', queryParams, { fullResponse: true });\n return new user_paginator_v1_1.UserSearchV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /* Friendship API */\n /**\n * Returns detailed information about the relationship between two arbitrary users.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-friendships-show\n */\n friendship(sources) {\n return this.get('friendships/show.json', sources);\n }\n /**\n * Returns the relationships of the authenticating user to the comma-separated list of up to 100 screen_names or user_ids provided.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-friendships-lookup\n */\n friendships(friendships) {\n return this.get('friendships/lookup.json', friendships);\n }\n /**\n * Returns a collection of user_ids that the currently authenticated user does not want to receive retweets from.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-friendships-no_retweets-ids\n */\n friendshipsNoRetweets() {\n return this.get('friendships/no_retweets/ids.json', { stringify_ids: true });\n }\n /**\n * Returns a collection of numeric IDs for every user who has a pending request to follow the authenticating user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-friendships-incoming\n */\n async friendshipsIncoming(options = {}) {\n const queryParams = {\n stringify_ids: true,\n ...options,\n };\n const initialRq = await this.get('friendships/incoming.json', queryParams, { fullResponse: true });\n return new user_paginator_v1_1.FriendshipsIncomingV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns a collection of numeric IDs for every protected user for whom the authenticating user has a pending follow request.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-friendships-outgoing\n */\n async friendshipsOutgoing(options = {}) {\n const queryParams = {\n stringify_ids: true,\n ...options,\n };\n const initialRq = await this.get('friendships/outgoing.json', queryParams, { fullResponse: true });\n return new user_paginator_v1_1.FriendshipsOutgoingV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /* Account/user API */\n /**\n * Get current account settings for authenticating user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/get-account-settings\n */\n accountSettings() {\n return this.get('account/settings.json');\n }\n /**\n * Returns a map of the available size variations of the specified user's profile banner.\n * If the user has not uploaded a profile banner, a HTTP 404 will be served instead.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/get-users-profile_banner\n */\n userProfileBannerSizes(params) {\n return this.get('users/profile_banner.json', params);\n }\n /* Lists */\n /**\n * Returns the specified list. Private lists will only be shown if the authenticated user owns the specified list.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/get-lists-show\n */\n list(options) {\n return this.get('lists/show.json', { tweet_mode: 'extended', ...options });\n }\n /**\n * Returns all lists the authenticating or specified user subscribes to, including their own.\n * If no user is given, the authenticating user is used.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/get-lists-list\n */\n lists(options = {}) {\n return this.get('lists/list.json', { tweet_mode: 'extended', ...options });\n }\n /**\n * Returns the members of the specified list. Private list members will only be shown if the authenticated user owns the specified list.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/get-lists-members\n */\n async listMembers(options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n ...options,\n };\n const initialRq = await this.get('lists/members.json', queryParams, { fullResponse: true });\n return new list_paginator_v1_1.ListMembersV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Check if the specified user is a member of the specified list.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/get-lists-members-show\n */\n listGetMember(options) {\n return this.get('lists/members/show.json', { tweet_mode: 'extended', ...options });\n }\n /**\n * Returns the lists the specified user has been added to.\n * If user_id or screen_name are not provided, the memberships for the authenticating user are returned.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/get-lists-memberships\n */\n async listMemberships(options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n ...options,\n };\n const initialRq = await this.get('lists/memberships.json', queryParams, { fullResponse: true });\n return new list_paginator_v1_1.ListMembershipsV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns the lists owned by the specified Twitter user. Private lists will only be shown if the authenticated user is also the owner of the lists.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/get-lists-ownerships\n */\n async listOwnerships(options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n ...options,\n };\n const initialRq = await this.get('lists/ownerships.json', queryParams, { fullResponse: true });\n return new list_paginator_v1_1.ListOwnershipsV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns a timeline of tweets authored by members of the specified list. Retweets are included by default.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/get-lists-statuses\n */\n async listStatuses(options) {\n const queryParams = {\n tweet_mode: 'extended',\n ...options,\n };\n const initialRq = await this.get('lists/statuses.json', queryParams, { fullResponse: true });\n return new tweet_paginator_v1_1.ListTimelineV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns the subscribers of the specified list. Private list subscribers will only be shown if the authenticated user owns the specified list.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/get-lists-subscribers\n */\n async listSubscribers(options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n ...options,\n };\n const initialRq = await this.get('lists/subscribers.json', queryParams, { fullResponse: true });\n return new list_paginator_v1_1.ListSubscribersV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Check if the specified user is a subscriber of the specified list. Returns the user if they are a subscriber.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/get-lists-subscribers-show\n */\n listGetSubscriber(options) {\n return this.get('lists/subscribers/show.json', { tweet_mode: 'extended', ...options });\n }\n /**\n * Obtain a collection of the lists the specified user is subscribed to, 20 lists per page by default.\n * Does not include the user's own lists.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/get-lists-subscriptions\n */\n async listSubscriptions(options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n ...options,\n };\n const initialRq = await this.get('lists/subscriptions.json', queryParams, { fullResponse: true });\n return new list_paginator_v1_1.ListSubscriptionsV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /* Media upload API */\n /**\n * The STATUS command (this method) is used to periodically poll for updates of media processing operation.\n * After the STATUS command response returns succeeded, you can move on to the next step which is usually create Tweet with media_id.\n * https://developer.x.com/en/docs/twitter-api/v1/media/upload-media/api-reference/get-media-upload-status\n */\n mediaInfo(mediaId) {\n return this.get('media/upload.json', {\n command: 'STATUS',\n media_id: mediaId,\n }, { prefix: globals_1.API_V1_1_UPLOAD_PREFIX });\n }\n filterStream({ autoConnect, ...params } = {}) {\n const parameters = {};\n for (const [key, value] of Object.entries(params)) {\n if (key === 'follow' || key === 'track') {\n parameters[key] = value.toString();\n }\n else if (key === 'locations') {\n const locations = value;\n parameters.locations = (0, helpers_1.arrayWrap)(locations).map(loc => `${loc.lng},${loc.lat}`).join(',');\n }\n else {\n parameters[key] = value;\n }\n }\n const streamClient = this.stream;\n return streamClient.postStream('statuses/filter.json', parameters, { autoConnect });\n }\n sampleStream({ autoConnect, ...params } = {}) {\n const streamClient = this.stream;\n return streamClient.getStream('statuses/sample.json', params, { autoConnect });\n }\n /**\n * Create a client that is prefixed with `https//stream.x.com` instead of classic API URL.\n */\n get stream() {\n const copiedClient = new client_v1_1.default(this);\n copiedClient.setPrefix(globals_1.API_V1_1_STREAM_PREFIX);\n return copiedClient;\n }\n /* Trends API */\n /**\n * Returns the top 50 trending topics for a specific id, if trending information is available for it.\n * Note: The id parameter for this endpoint is the \"where on earth identifier\" or WOEID, which is a legacy identifier created by Yahoo and has been deprecated.\n * https://developer.x.com/en/docs/twitter-api/v1/trends/trends-for-location/api-reference/get-trends-place\n */\n trendsByPlace(woeId, options = {}) {\n return this.get('trends/place.json', { id: woeId, ...options });\n }\n /**\n * Returns the locations that Twitter has trending topic information for.\n * The response is an array of \"locations\" that encode the location's WOEID\n * and some other human-readable information such as a canonical name and country the location belongs in.\n * https://developer.x.com/en/docs/twitter-api/v1/trends/locations-with-trending-topics/api-reference/get-trends-available\n */\n trendsAvailable() {\n return this.get('trends/available.json');\n }\n /**\n * Returns the locations that Twitter has trending topic information for, closest to a specified location.\n * https://developer.x.com/en/docs/twitter-api/v1/trends/locations-with-trending-topics/api-reference/get-trends-closest\n */\n trendsClosest(lat, long) {\n return this.get('trends/closest.json', { lat, long });\n }\n /* Geo API */\n /**\n * Returns all the information about a known place.\n * https://developer.x.com/en/docs/twitter-api/v1/geo/place-information/api-reference/get-geo-id-place_id\n */\n geoPlace(placeId) {\n return this.get('geo/id/:place_id.json', undefined, { params: { place_id: placeId } });\n }\n /**\n * Search for places that can be attached to a Tweet via POST statuses/update.\n * This request will return a list of all the valid places that can be used as the place_id when updating a status.\n * https://developer.x.com/en/docs/twitter-api/v1/geo/places-near-location/api-reference/get-geo-search\n */\n geoSearch(options) {\n return this.get('geo/search.json', options);\n }\n /**\n * Given a latitude and a longitude, searches for up to 20 places that can be used as a place_id when updating a status.\n * This request is an informative call and will deliver generalized results about geography.\n * https://developer.x.com/en/docs/twitter-api/v1/geo/places-near-location/api-reference/get-geo-reverse_geocode\n */\n geoReverseGeoCode(options) {\n return this.get('geo/reverse_geocode.json', options);\n }\n /* Developer utilities */\n /**\n * Returns the current rate limits for methods belonging to the specified resource families.\n * Each API resource belongs to a \"resource family\" which is indicated in its method documentation.\n * The method's resource family can be determined from the first component of the path after the resource version.\n * https://developer.x.com/en/docs/twitter-api/v1/developer-utilities/rate-limit-status/api-reference/get-application-rate_limit_status\n */\n rateLimitStatuses(...resources) {\n return this.get('application/rate_limit_status.json', { resources });\n }\n /**\n * Returns the list of languages supported by Twitter along with the language code supported by Twitter.\n * https://developer.x.com/en/docs/twitter-api/v1/developer-utilities/supported-languages/api-reference/get-help-languages\n */\n supportedLanguages() {\n return this.get('help/languages.json');\n }\n}\nexports.default = TwitterApiv1ReadOnly;\n",
55
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readNextPartOf = exports.sleepSecs = exports.getMediaCategoryByMime = exports.getMimeType = exports.getFileSizeFromFileHandle = exports.getFileHandle = exports.readFileIntoBuffer = void 0;\nconst fs = __importStar(require(\"fs\"));\nconst helpers_1 = require(\"../helpers\");\nconst types_1 = require(\"../types\");\nasync function readFileIntoBuffer(file) {\n const handle = await getFileHandle(file);\n if (typeof handle === 'number') {\n return new Promise((resolve, reject) => {\n fs.readFile(handle, (err, data) => {\n if (err) {\n return reject(err);\n }\n resolve(data);\n });\n });\n }\n else if (handle instanceof Buffer) {\n return handle;\n }\n else {\n return handle.readFile();\n }\n}\nexports.readFileIntoBuffer = readFileIntoBuffer;\nfunction getFileHandle(file) {\n if (typeof file === 'string') {\n return fs.promises.open(file, 'r');\n }\n else if (typeof file === 'number') {\n return file;\n }\n else if (typeof file === 'object' && !(file instanceof Buffer)) {\n return file;\n }\n else if (!(file instanceof Buffer)) {\n throw new Error('Given file is not valid, please check its type.');\n }\n else {\n return file;\n }\n}\nexports.getFileHandle = getFileHandle;\nasync function getFileSizeFromFileHandle(fileHandle) {\n // Get the file size\n if (typeof fileHandle === 'number') {\n const stats = await new Promise((resolve, reject) => {\n fs.fstat(fileHandle, (err, stats) => {\n if (err)\n reject(err);\n resolve(stats);\n });\n });\n return stats.size;\n }\n else if (fileHandle instanceof Buffer) {\n return fileHandle.length;\n }\n else {\n return (await fileHandle.stat()).size;\n }\n}\nexports.getFileSizeFromFileHandle = getFileSizeFromFileHandle;\nfunction getMimeType(file, type, mimeType) {\n if (typeof mimeType === 'string') {\n return mimeType;\n }\n else if (typeof file === 'string' && !type) {\n return getMimeByName(file);\n }\n else if (typeof type === 'string') {\n return getMimeByType(type);\n }\n throw new Error('You must specify type if file is a file handle or Buffer.');\n}\nexports.getMimeType = getMimeType;\nfunction getMimeByName(name) {\n if (name.endsWith('.jpeg') || name.endsWith('.jpg'))\n return types_1.EUploadMimeType.Jpeg;\n if (name.endsWith('.png'))\n return types_1.EUploadMimeType.Png;\n if (name.endsWith('.webp'))\n return types_1.EUploadMimeType.Webp;\n if (name.endsWith('.gif'))\n return types_1.EUploadMimeType.Gif;\n if (name.endsWith('.mpeg4') || name.endsWith('.mp4'))\n return types_1.EUploadMimeType.Mp4;\n if (name.endsWith('.mov') || name.endsWith('.mov'))\n return types_1.EUploadMimeType.Mov;\n if (name.endsWith('.srt'))\n return types_1.EUploadMimeType.Srt;\n (0, helpers_1.safeDeprecationWarning)({\n instance: 'TwitterApiv1ReadWrite',\n method: 'uploadMedia',\n problem: 'options.mimeType is missing and filename couldn\\'t help to resolve MIME type, so it will fallback to image/jpeg',\n resolution: 'If you except to give filenames without extensions, please specify explicitlty the MIME type using options.mimeType',\n });\n return types_1.EUploadMimeType.Jpeg;\n}\nfunction getMimeByType(type) {\n (0, helpers_1.safeDeprecationWarning)({\n instance: 'TwitterApiv1ReadWrite',\n method: 'uploadMedia',\n problem: 'you\\'re using options.type',\n resolution: 'Remove options.type argument and migrate to options.mimeType which takes the real MIME type. ' +\n 'If you\\'re using type=longmp4, add options.longVideo alongside of mimeType=EUploadMimeType.Mp4',\n });\n if (type === 'gif')\n return types_1.EUploadMimeType.Gif;\n if (type === 'jpg')\n return types_1.EUploadMimeType.Jpeg;\n if (type === 'png')\n return types_1.EUploadMimeType.Png;\n if (type === 'webp')\n return types_1.EUploadMimeType.Webp;\n if (type === 'srt')\n return types_1.EUploadMimeType.Srt;\n if (type === 'mp4' || type === 'longmp4')\n return types_1.EUploadMimeType.Mp4;\n if (type === 'mov')\n return types_1.EUploadMimeType.Mov;\n return type;\n}\nfunction getMediaCategoryByMime(name, target) {\n if (name === types_1.EUploadMimeType.Mp4 || name === types_1.EUploadMimeType.Mov)\n return target === 'tweet' ? 'TweetVideo' : 'DmVideo';\n if (name === types_1.EUploadMimeType.Gif)\n return target === 'tweet' ? 'TweetGif' : 'DmGif';\n if (name === types_1.EUploadMimeType.Srt)\n return 'Subtitles';\n else\n return target === 'tweet' ? 'TweetImage' : 'DmImage';\n}\nexports.getMediaCategoryByMime = getMediaCategoryByMime;\nfunction sleepSecs(seconds) {\n return new Promise(resolve => setTimeout(resolve, seconds * 1000));\n}\nexports.sleepSecs = sleepSecs;\nasync function readNextPartOf(file, chunkLength, bufferOffset = 0, buffer) {\n if (file instanceof Buffer) {\n const rt = file.slice(bufferOffset, bufferOffset + chunkLength);\n return [rt, rt.length];\n }\n if (!buffer) {\n throw new Error('Well, we will need a buffer to store file content.');\n }\n let bytesRead;\n if (typeof file === 'number') {\n bytesRead = await new Promise((resolve, reject) => {\n fs.read(file, buffer, 0, chunkLength, bufferOffset, (err, nread) => {\n if (err)\n reject(err);\n resolve(nread);\n });\n });\n }\n else {\n const res = await file.read(buffer, 0, chunkLength, bufferOffset);\n bytesRead = res.bytesRead;\n }\n return [buffer, bytesRead];\n}\nexports.readNextPartOf = readNextPartOf;\n",
56
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs = __importStar(require(\"fs\"));\nconst globals_1 = require(\"../globals\");\nconst helpers_1 = require(\"../helpers\");\nconst types_1 = require(\"../types\");\nconst client_v1_read_1 = __importDefault(require(\"./client.v1.read\"));\nconst media_helpers_v1_1 = require(\"./media-helpers.v1\");\nconst UPLOAD_ENDPOINT = 'media/upload.json';\n/**\n * Base Twitter v1 client with read/write rights.\n */\nclass TwitterApiv1ReadWrite extends client_v1_read_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_V1_1_PREFIX;\n }\n /**\n * Get a client with only read rights.\n */\n get readOnly() {\n return this;\n }\n /* Tweet API */\n /**\n * Post a new tweet.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/post-statuses-update\n */\n tweet(status, payload = {}) {\n const queryParams = {\n status,\n tweet_mode: 'extended',\n ...payload,\n };\n return this.post('statuses/update.json', queryParams);\n }\n /**\n * Quote an existing tweet.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/post-statuses-update\n */\n async quote(status, quotingStatusId, payload = {}) {\n const url = 'https://x.com/i/statuses/' + quotingStatusId;\n return this.tweet(status, { ...payload, attachment_url: url });\n }\n /**\n * Post a series of tweets.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/post-statuses-update\n */\n async tweetThread(tweets) {\n const postedTweets = [];\n for (const tweet of tweets) {\n // Retrieve the last sent tweet\n const lastTweet = postedTweets.length ? postedTweets[postedTweets.length - 1] : null;\n // Build the tweet query params\n const queryParams = { ...(typeof tweet === 'string' ? ({ status: tweet }) : tweet) };\n // Reply to an existing tweet if needed\n const inReplyToId = lastTweet ? lastTweet.id_str : queryParams.in_reply_to_status_id;\n const status = queryParams.status;\n if (inReplyToId) {\n postedTweets.push(await this.reply(status, inReplyToId, queryParams));\n }\n else {\n postedTweets.push(await this.tweet(status, queryParams));\n }\n }\n return postedTweets;\n }\n /**\n * Reply to an existing tweet. Shortcut to `.tweet` with tweaked parameters.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/post-statuses-update\n */\n reply(status, in_reply_to_status_id, payload = {}) {\n return this.tweet(status, {\n auto_populate_reply_metadata: true,\n in_reply_to_status_id,\n ...payload,\n });\n }\n /**\n * Delete an existing tweet belonging to you.\n * https://developer.x.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/post-statuses-destroy-id\n */\n deleteTweet(tweetId) {\n return this.post('statuses/destroy/:id.json', { tweet_mode: 'extended' }, { params: { id: tweetId } });\n }\n /* User API */\n /**\n * Report the specified user as a spam account to Twitter.\n * Additionally, optionally performs the equivalent of POST blocks/create on behalf of the authenticated user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/mute-block-report-users/api-reference/post-users-report_spam\n */\n reportUserAsSpam(options) {\n return this.post('users/report_spam.json', { tweet_mode: 'extended', ...options });\n }\n /**\n * Turn on/off Retweets and device notifications from the specified user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/post-friendships-update\n */\n updateFriendship(options) {\n return this.post('friendships/update.json', options);\n }\n /**\n * Follow the specified user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/post-friendships-create\n */\n createFriendship(options) {\n return this.post('friendships/create.json', options);\n }\n /**\n * Unfollow the specified user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/post-friendships-destroy\n */\n destroyFriendship(options) {\n return this.post('friendships/destroy.json', options);\n }\n /* Account API */\n /**\n * Update current account settings for authenticating user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/get-account-settings\n */\n updateAccountSettings(options) {\n return this.post('account/settings.json', options);\n }\n /**\n * Sets some values that users are able to set under the \"Account\" tab of their settings page.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile\n */\n updateAccountProfile(options) {\n return this.post('account/update_profile.json', options);\n }\n /**\n * Uploads a profile banner on behalf of the authenticating user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile_banner\n */\n async updateAccountProfileBanner(file, options = {}) {\n const queryParams = {\n banner: await (0, media_helpers_v1_1.readFileIntoBuffer)(file),\n ...options,\n };\n return this.post('account/update_profile_banner.json', queryParams, { forceBodyMode: 'form-data' });\n }\n /**\n * Updates the authenticating user's profile image.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile_image\n */\n async updateAccountProfileImage(file, options = {}) {\n const queryParams = {\n tweet_mode: 'extended',\n image: await (0, media_helpers_v1_1.readFileIntoBuffer)(file),\n ...options,\n };\n return this.post('account/update_profile_image.json', queryParams, { forceBodyMode: 'form-data' });\n }\n /**\n * Removes the uploaded profile banner for the authenticating user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner\n */\n removeAccountProfileBanner() {\n return this.post('account/remove_profile_banner.json');\n }\n /* Lists */\n /**\n * Creates a new list for the authenticated user.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/post-lists-create\n */\n createList(options) {\n return this.post('lists/create.json', { tweet_mode: 'extended', ...options });\n }\n /**\n * Updates the specified list. The authenticated user must own the list to be able to update it.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/post-lists-update\n */\n updateList(options) {\n return this.post('lists/update.json', { tweet_mode: 'extended', ...options });\n }\n /**\n * Deletes the specified list. The authenticated user must own the list to be able to destroy it.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/post-lists-destroy\n */\n removeList(options) {\n return this.post('lists/destroy.json', { tweet_mode: 'extended', ...options });\n }\n /**\n * Adds multiple members to a list, by specifying a comma-separated list of member ids or screen names.\n * If you add a single `user_id` or `screen_name`, it will target `lists/members/create.json`, otherwise\n * it will target `lists/members/create_all.json`.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/post-lists-members-create_all\n */\n addListMembers(options) {\n const hasMultiple = (options.user_id && (0, helpers_1.hasMultipleItems)(options.user_id)) || (options.screen_name && (0, helpers_1.hasMultipleItems)(options.screen_name));\n const endpoint = hasMultiple ? 'lists/members/create_all.json' : 'lists/members/create.json';\n return this.post(endpoint, options);\n }\n /**\n * Removes one or more members from a list, by specifying a comma-separated list of member ids or screen names.\n * If you add a single `user_id` or `screen_name`, it will target `lists/members/destroy.json`, otherwise\n * it will target `lists/members/destroy_all.json`.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/post-lists-members-destroy_all\n */\n removeListMembers(options) {\n const hasMultiple = (options.user_id && (0, helpers_1.hasMultipleItems)(options.user_id)) || (options.screen_name && (0, helpers_1.hasMultipleItems)(options.screen_name));\n const endpoint = hasMultiple ? 'lists/members/destroy_all.json' : 'lists/members/destroy.json';\n return this.post(endpoint, options);\n }\n /**\n * Subscribes the authenticated user to the specified list.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/post-lists-subscribers-create\n */\n subscribeToList(options) {\n return this.post('lists/subscribers/create.json', { tweet_mode: 'extended', ...options });\n }\n /**\n * Unsubscribes the authenticated user of the specified list.\n * https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/post-lists-subscribers-destroy\n */\n unsubscribeOfList(options) {\n return this.post('lists/subscribers/destroy.json', { tweet_mode: 'extended', ...options });\n }\n /* Media upload API */\n /**\n * This endpoint can be used to provide additional information about the uploaded media_id.\n * This feature is currently only supported for images and GIFs.\n * https://developer.x.com/en/docs/twitter-api/v1/media/upload-media/api-reference/post-media-metadata-create\n */\n createMediaMetadata(mediaId, metadata) {\n return this.post('media/metadata/create.json', { media_id: mediaId, ...metadata }, { prefix: globals_1.API_V1_1_UPLOAD_PREFIX, forceBodyMode: 'json' });\n }\n /**\n * Use this endpoint to associate uploaded subtitles to an uploaded video. You can associate subtitles to video before or after Tweeting.\n * **To obtain subtitle media ID, you must upload each subtitle file separately using `.uploadMedia()` method.**\n *\n * https://developer.x.com/en/docs/twitter-api/v1/media/upload-media/api-reference/post-media-subtitles-create\n */\n createMediaSubtitles(mediaId, subtitles) {\n return this.post('media/subtitles/create.json', { media_id: mediaId, media_category: 'TweetVideo', subtitle_info: { subtitles } }, { prefix: globals_1.API_V1_1_UPLOAD_PREFIX, forceBodyMode: 'json' });\n }\n /**\n * Use this endpoint to dissociate subtitles from a video and delete the subtitles. You can dissociate subtitles from a video before or after Tweeting.\n * https://developer.x.com/en/docs/twitter-api/v1/media/upload-media/api-reference/post-media-subtitles-delete\n */\n deleteMediaSubtitles(mediaId, ...languages) {\n return this.post('media/subtitles/delete.json', {\n media_id: mediaId,\n media_category: 'TweetVideo',\n subtitle_info: { subtitles: languages.map(lang => ({ language_code: lang })) },\n }, { prefix: globals_1.API_V1_1_UPLOAD_PREFIX, forceBodyMode: 'json' });\n }\n async uploadMedia(file, options = {}, returnFullMediaData = false) {\n var _a;\n const chunkLength = (_a = options.chunkLength) !== null && _a !== void 0 ? _a : (1024 * 1024);\n const { fileHandle, mediaCategory, fileSize, mimeType } = await this.getUploadMediaRequirements(file, options);\n // Get the file handle (if not buffer)\n try {\n // Finally! We can send INIT message.\n const mediaData = await this.post(UPLOAD_ENDPOINT, {\n command: 'INIT',\n total_bytes: fileSize,\n media_type: mimeType,\n media_category: mediaCategory,\n additional_owners: options.additionalOwners,\n shared: options.shared ? true : undefined,\n }, { prefix: globals_1.API_V1_1_UPLOAD_PREFIX });\n // Upload the media chunk by chunk\n await this.mediaChunkedUpload(fileHandle, chunkLength, mediaData.media_id_string, options.maxConcurrentUploads);\n // Finalize media\n const fullMediaData = await this.post(UPLOAD_ENDPOINT, {\n command: 'FINALIZE',\n media_id: mediaData.media_id_string,\n }, { prefix: globals_1.API_V1_1_UPLOAD_PREFIX });\n if (fullMediaData.processing_info && fullMediaData.processing_info.state !== 'succeeded') {\n // Must wait if video is still computed\n await this.awaitForMediaProcessingCompletion(fullMediaData);\n }\n // Video is ready, return media_id\n if (returnFullMediaData) {\n return fullMediaData;\n }\n else {\n return fullMediaData.media_id_string;\n }\n }\n finally {\n // Close file if any\n if (typeof file === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n fs.close(file, () => { });\n }\n else if (typeof fileHandle === 'object' && !(fileHandle instanceof Buffer)) {\n fileHandle.close();\n }\n }\n }\n async awaitForMediaProcessingCompletion(fullMediaData) {\n var _a;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n fullMediaData = await this.mediaInfo(fullMediaData.media_id_string);\n const { processing_info } = fullMediaData;\n if (!processing_info || processing_info.state === 'succeeded') {\n // Ok, completed!\n return;\n }\n if ((_a = processing_info.error) === null || _a === void 0 ? void 0 : _a.code) {\n const { name, message } = processing_info.error;\n throw new Error(`Failed to process media: ${name} - ${message}.`);\n }\n if (processing_info.state === 'failed') {\n // No error data\n throw new Error('Failed to process the media.');\n }\n if (processing_info.check_after_secs) {\n // Await for given seconds\n await (0, media_helpers_v1_1.sleepSecs)(processing_info.check_after_secs);\n }\n else {\n // No info; Await for 5 seconds\n await (0, media_helpers_v1_1.sleepSecs)(5);\n }\n }\n }\n async getUploadMediaRequirements(file, { mimeType, type, target, longVideo } = {}) {\n // Get the file handle (if not buffer)\n let fileHandle;\n try {\n fileHandle = await (0, media_helpers_v1_1.getFileHandle)(file);\n // Get the mimetype\n const realMimeType = (0, media_helpers_v1_1.getMimeType)(file, type, mimeType);\n // Get the media category\n let mediaCategory;\n // If explicit longmp4 OR explicit MIME type and not DM target\n if (realMimeType === types_1.EUploadMimeType.Mp4 && ((!mimeType && !type && target !== 'dm') || longVideo)) {\n mediaCategory = 'amplify_video';\n }\n else {\n mediaCategory = (0, media_helpers_v1_1.getMediaCategoryByMime)(realMimeType, target !== null && target !== void 0 ? target : 'tweet');\n }\n return {\n fileHandle,\n mediaCategory,\n fileSize: await (0, media_helpers_v1_1.getFileSizeFromFileHandle)(fileHandle),\n mimeType: realMimeType,\n };\n }\n catch (e) {\n // Close file if any\n if (typeof file === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n fs.close(file, () => { });\n }\n else if (typeof fileHandle === 'object' && !(fileHandle instanceof Buffer)) {\n fileHandle.close();\n }\n throw e;\n }\n }\n async mediaChunkedUpload(fileHandle, chunkLength, mediaId, maxConcurrentUploads = 3) {\n // Send chunk by chunk\n let chunkIndex = 0;\n if (maxConcurrentUploads < 1) {\n throw new RangeError('Bad maxConcurrentUploads parameter.');\n }\n // Creating a buffer for doing file stuff (if we don't have one)\n const buffer = fileHandle instanceof Buffer ? undefined : Buffer.alloc(chunkLength);\n // Sliced/filled buffer returned for each part\n let readBuffer;\n // Needed to know when we should stop reading the file\n let nread;\n // Needed to use the buffer object (file handles always \"remembers\" file position)\n let offset = 0;\n [readBuffer, nread] = await (0, media_helpers_v1_1.readNextPartOf)(fileHandle, chunkLength, offset, buffer);\n offset += nread;\n // Handle max concurrent uploads\n const currentUploads = new Set();\n // Read buffer until file is completely read\n while (nread) {\n const mediaBufferPart = readBuffer.slice(0, nread);\n // Sent part if part has something inside\n if (mediaBufferPart.length) {\n const request = this.post(UPLOAD_ENDPOINT, {\n command: 'APPEND',\n media_id: mediaId,\n segment_index: chunkIndex,\n media: mediaBufferPart,\n }, { prefix: globals_1.API_V1_1_UPLOAD_PREFIX });\n currentUploads.add(request);\n request.then(() => {\n currentUploads.delete(request);\n });\n chunkIndex++;\n }\n if (currentUploads.size >= maxConcurrentUploads) {\n // Await for first promise to be finished\n await Promise.race(currentUploads);\n }\n [readBuffer, nread] = await (0, media_helpers_v1_1.readNextPartOf)(fileHandle, chunkLength, offset, buffer);\n offset += nread;\n }\n await Promise.all([...currentUploads]);\n }\n}\nexports.default = TwitterApiv1ReadWrite;\n",
57
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TwitterApiv1 = void 0;\nconst globals_1 = require(\"../globals\");\nconst dm_paginator_v1_1 = require(\"../paginators/dm.paginator.v1\");\nconst types_1 = require(\"../types\");\nconst client_v1_write_1 = __importDefault(require(\"./client.v1.write\"));\n/**\n * Twitter v1.1 API client with read/write/DMs rights.\n */\nclass TwitterApiv1 extends client_v1_write_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_V1_1_PREFIX;\n }\n /**\n * Get a client with read/write rights.\n */\n get readWrite() {\n return this;\n }\n /* Direct messages */\n // Part: Sending and receiving events\n /**\n * Publishes a new message_create event resulting in a Direct Message sent to a specified user from the authenticating user.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/new-event\n */\n sendDm({ recipient_id, custom_profile_id, ...params }) {\n const args = {\n event: {\n type: types_1.EDirectMessageEventTypeV1.Create,\n [types_1.EDirectMessageEventTypeV1.Create]: {\n target: { recipient_id },\n message_data: params,\n },\n },\n };\n if (custom_profile_id) {\n args.event[types_1.EDirectMessageEventTypeV1.Create].custom_profile_id = custom_profile_id;\n }\n return this.post('direct_messages/events/new.json', args, {\n forceBodyMode: 'json',\n });\n }\n /**\n * Returns a single Direct Message event by the given id.\n *\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/get-event\n */\n getDmEvent(id) {\n return this.get('direct_messages/events/show.json', { id });\n }\n /**\n * Deletes the direct message specified in the required ID parameter.\n * The authenticating user must be the recipient of the specified direct message.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/delete-message-event\n */\n deleteDm(id) {\n return this.delete('direct_messages/events/destroy.json', { id });\n }\n /**\n * Returns all Direct Message events (both sent and received) within the last 30 days.\n * Sorted in reverse-chronological order.\n *\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/list-events\n */\n async listDmEvents(args = {}) {\n const queryParams = { ...args };\n const initialRq = await this.get('direct_messages/events/list.json', queryParams, { fullResponse: true });\n return new dm_paginator_v1_1.DmEventsV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n // Part: Welcome messages (events)\n /**\n * Creates a new Welcome Message that will be stored and sent in the future from the authenticating user in defined circumstances.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/new-welcome-message\n */\n newWelcomeDm(name, data) {\n const args = {\n [types_1.EDirectMessageEventTypeV1.WelcomeCreate]: {\n name,\n message_data: data,\n },\n };\n return this.post('direct_messages/welcome_messages/new.json', args, {\n forceBodyMode: 'json',\n });\n }\n /**\n * Returns a Welcome Message by the given id.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/get-welcome-message\n */\n getWelcomeDm(id) {\n return this.get('direct_messages/welcome_messages/show.json', { id });\n }\n /**\n * Deletes a Welcome Message by the given id.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/delete-welcome-message\n */\n deleteWelcomeDm(id) {\n return this.delete('direct_messages/welcome_messages/destroy.json', { id });\n }\n /**\n * Updates a Welcome Message by the given ID.\n * Updates to the welcome_message object are atomic.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/update-welcome-message\n */\n updateWelcomeDm(id, data) {\n const args = { message_data: data };\n return this.put('direct_messages/welcome_messages/update.json', args, {\n forceBodyMode: 'json',\n query: { id },\n });\n }\n /**\n * Returns all Direct Message events (both sent and received) within the last 30 days.\n * Sorted in reverse-chronological order.\n *\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/list-events\n */\n async listWelcomeDms(args = {}) {\n const queryParams = { ...args };\n const initialRq = await this.get('direct_messages/welcome_messages/list.json', queryParams, { fullResponse: true });\n return new dm_paginator_v1_1.WelcomeDmV1Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n // Part: Welcome message (rules)\n /**\n * Creates a new Welcome Message Rule that determines which Welcome Message will be shown in a given conversation.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/new-welcome-message-rule\n */\n newWelcomeDmRule(welcomeMessageId) {\n return this.post('direct_messages/welcome_messages/rules/new.json', {\n welcome_message_rule: { welcome_message_id: welcomeMessageId },\n }, {\n forceBodyMode: 'json',\n });\n }\n /**\n * Returns a Welcome Message Rule by the given id.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/get-welcome-message-rule\n */\n getWelcomeDmRule(id) {\n return this.get('direct_messages/welcome_messages/rules/show.json', { id });\n }\n /**\n * Deletes a Welcome Message Rule by the given id.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/delete-welcome-message-rule\n */\n deleteWelcomeDmRule(id) {\n return this.delete('direct_messages/welcome_messages/rules/destroy.json', { id });\n }\n /**\n * Retrieves all welcome DM rules for this account.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/list-welcome-message-rules\n */\n async listWelcomeDmRules(args = {}) {\n const queryParams = { ...args };\n return this.get('direct_messages/welcome_messages/rules/list.json', queryParams);\n }\n /**\n * Set the current showed welcome message for logged account ; wrapper for Welcome DM rules.\n * Test if a rule already exists, delete if any, then create a rule for current message ID.\n *\n * If you don't have already a welcome message, create it with `.newWelcomeMessage`.\n */\n async setWelcomeDm(welcomeMessageId, deleteAssociatedWelcomeDmWhenDeletingRule = true) {\n var _a;\n const existingRules = await this.listWelcomeDmRules();\n if ((_a = existingRules.welcome_message_rules) === null || _a === void 0 ? void 0 : _a.length) {\n for (const rule of existingRules.welcome_message_rules) {\n await this.deleteWelcomeDmRule(rule.id);\n if (deleteAssociatedWelcomeDmWhenDeletingRule) {\n await this.deleteWelcomeDm(rule.welcome_message_id);\n }\n }\n }\n return this.newWelcomeDmRule(welcomeMessageId);\n }\n // Part: Read indicator\n /**\n * Marks a message as read in the recipient’s Direct Message conversation view with the sender.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/typing-indicator-and-read-receipts/api-reference/new-read-receipt\n */\n markDmAsRead(lastEventId, recipientId) {\n return this.post('direct_messages/mark_read.json', {\n last_read_event_id: lastEventId,\n recipient_id: recipientId,\n }, { forceBodyMode: 'url' });\n }\n /**\n * Displays a visual typing indicator in the recipient’s Direct Message conversation view with the sender.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/typing-indicator-and-read-receipts/api-reference/new-typing-indicator\n */\n indicateDmTyping(recipientId) {\n return this.post('direct_messages/indicate_typing.json', {\n recipient_id: recipientId,\n }, { forceBodyMode: 'url' });\n }\n // Part: Images\n /**\n * Get a single image attached to a direct message. TwitterApi client must be logged with OAuth 1.0a.\n * https://developer.x.com/en/docs/twitter-api/v1/direct-messages/message-attachments/guides/retrieving-media\n */\n async downloadDmImage(urlOrDm) {\n if (typeof urlOrDm !== 'string') {\n const attachment = urlOrDm[types_1.EDirectMessageEventTypeV1.Create].message_data.attachment;\n if (!attachment) {\n throw new Error('The given direct message doesn\\'t contain any attachment');\n }\n urlOrDm = attachment.media.media_url_https;\n }\n const data = await this.get(urlOrDm, undefined, { forceParseMode: 'buffer', prefix: '' });\n if (!data.length) {\n throw new Error('Image not found. Make sure you are logged with credentials able to access direct messages, and check the URL.');\n }\n return data;\n }\n}\nexports.TwitterApiv1 = TwitterApiv1;\nexports.default = TwitterApiv1;\n",
58
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TwitterV2IncludesHelper = void 0;\n/**\n * Provide helpers for `.includes` of a v2 API result.\n * Needed expansions for a method to work are specified (*`like this`*).\n */\nclass TwitterV2IncludesHelper {\n constructor(result) {\n this.result = result;\n }\n /* Tweets */\n get tweets() {\n return TwitterV2IncludesHelper.tweets(this.result);\n }\n static tweets(result) {\n var _a, _b;\n return (_b = (_a = result.includes) === null || _a === void 0 ? void 0 : _a.tweets) !== null && _b !== void 0 ? _b : [];\n }\n tweetById(id) {\n return TwitterV2IncludesHelper.tweetById(this.result, id);\n }\n static tweetById(result, id) {\n return this.tweets(result).find(tweet => tweet.id === id);\n }\n /** Retweet associated with the given tweet (*`referenced_tweets.id`*) */\n retweet(tweet) {\n return TwitterV2IncludesHelper.retweet(this.result, tweet);\n }\n /** Retweet associated with the given tweet (*`referenced_tweets.id`*) */\n static retweet(result, tweet) {\n var _a;\n const retweetIds = ((_a = tweet.referenced_tweets) !== null && _a !== void 0 ? _a : [])\n .filter(ref => ref.type === 'retweeted')\n .map(ref => ref.id);\n return this.tweets(result).find(t => retweetIds.includes(t.id));\n }\n /** Quoted tweet associated with the given tweet (*`referenced_tweets.id`*) */\n quote(tweet) {\n return TwitterV2IncludesHelper.quote(this.result, tweet);\n }\n /** Quoted tweet associated with the given tweet (*`referenced_tweets.id`*) */\n static quote(result, tweet) {\n var _a;\n const quoteIds = ((_a = tweet.referenced_tweets) !== null && _a !== void 0 ? _a : [])\n .filter(ref => ref.type === 'quoted')\n .map(ref => ref.id);\n return this.tweets(result).find(t => quoteIds.includes(t.id));\n }\n /** Tweet whose has been answered by the given tweet (*`referenced_tweets.id`*) */\n repliedTo(tweet) {\n return TwitterV2IncludesHelper.repliedTo(this.result, tweet);\n }\n /** Tweet whose has been answered by the given tweet (*`referenced_tweets.id`*) */\n static repliedTo(result, tweet) {\n var _a;\n const repliesIds = ((_a = tweet.referenced_tweets) !== null && _a !== void 0 ? _a : [])\n .filter(ref => ref.type === 'replied_to')\n .map(ref => ref.id);\n return this.tweets(result).find(t => repliesIds.includes(t.id));\n }\n /** Tweet author user object of the given tweet (*`author_id`* or *`referenced_tweets.id.author_id`*) */\n author(tweet) {\n return TwitterV2IncludesHelper.author(this.result, tweet);\n }\n /** Tweet author user object of the given tweet (*`author_id`* or *`referenced_tweets.id.author_id`*) */\n static author(result, tweet) {\n const authorId = tweet.author_id;\n return authorId ? this.users(result).find(u => u.id === authorId) : undefined;\n }\n /** Tweet author user object of the tweet answered by the given tweet (*`in_reply_to_user_id`*) */\n repliedToAuthor(tweet) {\n return TwitterV2IncludesHelper.repliedToAuthor(this.result, tweet);\n }\n /** Tweet author user object of the tweet answered by the given tweet (*`in_reply_to_user_id`*) */\n static repliedToAuthor(result, tweet) {\n const inReplyUserId = tweet.in_reply_to_user_id;\n return inReplyUserId ? this.users(result).find(u => u.id === inReplyUserId) : undefined;\n }\n /* Users */\n get users() {\n return TwitterV2IncludesHelper.users(this.result);\n }\n static users(result) {\n var _a, _b;\n return (_b = (_a = result.includes) === null || _a === void 0 ? void 0 : _a.users) !== null && _b !== void 0 ? _b : [];\n }\n userById(id) {\n return TwitterV2IncludesHelper.userById(this.result, id);\n }\n static userById(result, id) {\n return this.users(result).find(u => u.id === id);\n }\n /** Pinned tweet of the given user (*`pinned_tweet_id`*) */\n pinnedTweet(user) {\n return TwitterV2IncludesHelper.pinnedTweet(this.result, user);\n }\n /** Pinned tweet of the given user (*`pinned_tweet_id`*) */\n static pinnedTweet(result, user) {\n return user.pinned_tweet_id ? this.tweets(result).find(t => t.id === user.pinned_tweet_id) : undefined;\n }\n /* Medias */\n get media() {\n return TwitterV2IncludesHelper.media(this.result);\n }\n static media(result) {\n var _a, _b;\n return (_b = (_a = result.includes) === null || _a === void 0 ? void 0 : _a.media) !== null && _b !== void 0 ? _b : [];\n }\n /** Medias associated with the given tweet (*`attachments.media_keys`*) */\n medias(tweet) {\n return TwitterV2IncludesHelper.medias(this.result, tweet);\n }\n /** Medias associated with the given tweet (*`attachments.media_keys`*) */\n static medias(result, tweet) {\n var _a, _b;\n const keys = (_b = (_a = tweet.attachments) === null || _a === void 0 ? void 0 : _a.media_keys) !== null && _b !== void 0 ? _b : [];\n return this.media(result).filter(m => keys.includes(m.media_key));\n }\n /* Polls */\n get polls() {\n return TwitterV2IncludesHelper.polls(this.result);\n }\n static polls(result) {\n var _a, _b;\n return (_b = (_a = result.includes) === null || _a === void 0 ? void 0 : _a.polls) !== null && _b !== void 0 ? _b : [];\n }\n /** Poll associated with the given tweet (*`attachments.poll_ids`*) */\n poll(tweet) {\n return TwitterV2IncludesHelper.poll(this.result, tweet);\n }\n /** Poll associated with the given tweet (*`attachments.poll_ids`*) */\n static poll(result, tweet) {\n var _a, _b;\n const pollIds = (_b = (_a = tweet.attachments) === null || _a === void 0 ? void 0 : _a.poll_ids) !== null && _b !== void 0 ? _b : [];\n if (pollIds.length) {\n const pollId = pollIds[0];\n return this.polls(result).find(p => p.id === pollId);\n }\n return undefined;\n }\n /* Places */\n get places() {\n return TwitterV2IncludesHelper.places(this.result);\n }\n static places(result) {\n var _a, _b;\n return (_b = (_a = result.includes) === null || _a === void 0 ? void 0 : _a.places) !== null && _b !== void 0 ? _b : [];\n }\n /** Place associated with the given tweet (*`geo.place_id`*) */\n place(tweet) {\n return TwitterV2IncludesHelper.place(this.result, tweet);\n }\n /** Place associated with the given tweet (*`geo.place_id`*) */\n static place(result, tweet) {\n var _a;\n const placeId = (_a = tweet.geo) === null || _a === void 0 ? void 0 : _a.place_id;\n return placeId ? this.places(result).find(p => p.id === placeId) : undefined;\n }\n /* Lists */\n /** List owner of the given list (*`owner_id`*) */\n listOwner(list) {\n return TwitterV2IncludesHelper.listOwner(this.result, list);\n }\n /** List owner of the given list (*`owner_id`*) */\n static listOwner(result, list) {\n const creatorId = list.owner_id;\n return creatorId ? this.users(result).find(p => p.id === creatorId) : undefined;\n }\n /* Spaces */\n /** Creator of the given space (*`creator_id`*) */\n spaceCreator(space) {\n return TwitterV2IncludesHelper.spaceCreator(this.result, space);\n }\n /** Creator of the given space (*`creator_id`*) */\n static spaceCreator(result, space) {\n const creatorId = space.creator_id;\n return creatorId ? this.users(result).find(p => p.id === creatorId) : undefined;\n }\n /** Current hosts of the given space (*`host_ids`*) */\n spaceHosts(space) {\n return TwitterV2IncludesHelper.spaceHosts(this.result, space);\n }\n /** Current hosts of the given space (*`host_ids`*) */\n static spaceHosts(result, space) {\n var _a;\n const hostIds = (_a = space.host_ids) !== null && _a !== void 0 ? _a : [];\n return this.users(result).filter(u => hostIds.includes(u.id));\n }\n /** Current speakers of the given space (*`speaker_ids`*) */\n spaceSpeakers(space) {\n return TwitterV2IncludesHelper.spaceSpeakers(this.result, space);\n }\n /** Current speakers of the given space (*`speaker_ids`*) */\n static spaceSpeakers(result, space) {\n var _a;\n const speakerIds = (_a = space.speaker_ids) !== null && _a !== void 0 ? _a : [];\n return this.users(result).filter(u => speakerIds.includes(u.id));\n }\n /** Current invited users of the given space (*`invited_user_ids`*) */\n spaceInvitedUsers(space) {\n return TwitterV2IncludesHelper.spaceInvitedUsers(this.result, space);\n }\n /** Current invited users of the given space (*`invited_user_ids`*) */\n static spaceInvitedUsers(result, space) {\n var _a;\n const invitedUserIds = (_a = space.invited_user_ids) !== null && _a !== void 0 ? _a : [];\n return this.users(result).filter(u => invitedUserIds.includes(u.id));\n }\n}\nexports.TwitterV2IncludesHelper = TwitterV2IncludesHelper;\n",
59
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TimelineV2Paginator = exports.TwitterV2Paginator = void 0;\nconst includes_v2_helper_1 = require(\"../v2/includes.v2.helper\");\nconst TwitterPaginator_1 = require(\"./TwitterPaginator\");\n/** A generic PreviousableTwitterPaginator with common v2 helper methods. */\nclass TwitterV2Paginator extends TwitterPaginator_1.PreviousableTwitterPaginator {\n updateIncludes(data) {\n // Update errors\n if (data.errors) {\n if (!this._realData.errors) {\n this._realData.errors = [];\n }\n this._realData.errors = [...this._realData.errors, ...data.errors];\n }\n // Update includes\n if (!data.includes) {\n return;\n }\n if (!this._realData.includes) {\n this._realData.includes = {};\n }\n const includesRealData = this._realData.includes;\n for (const [includeKey, includeArray] of Object.entries(data.includes)) {\n if (!includesRealData[includeKey]) {\n includesRealData[includeKey] = [];\n }\n includesRealData[includeKey] = [\n ...includesRealData[includeKey],\n ...includeArray,\n ];\n }\n }\n /** Throw if the current paginator is not usable. */\n assertUsable() {\n if (this.unusable) {\n throw new Error('Unable to use this paginator to fetch more data, as it does not contain any metadata.' +\n ' Check .errors property for more details.');\n }\n }\n get meta() {\n return this._realData.meta;\n }\n get includes() {\n var _a;\n if (!((_a = this._realData) === null || _a === void 0 ? void 0 : _a.includes)) {\n return new includes_v2_helper_1.TwitterV2IncludesHelper(this._realData);\n }\n if (this._includesInstance) {\n return this._includesInstance;\n }\n return this._includesInstance = new includes_v2_helper_1.TwitterV2IncludesHelper(this._realData);\n }\n get errors() {\n var _a;\n return (_a = this._realData.errors) !== null && _a !== void 0 ? _a : [];\n }\n /** `true` if this paginator only contains error payload and no metadata found to consume data. */\n get unusable() {\n return this.errors.length > 0 && !this._realData.meta && !this._realData.data;\n }\n}\nexports.TwitterV2Paginator = TwitterV2Paginator;\n/** A generic TwitterV2Paginator able to consume v2 timelines that use max_results and pagination tokens. */\nclass TimelineV2Paginator extends TwitterV2Paginator {\n refreshInstanceFromResult(response, isNextPage) {\n var _a;\n const result = response.data;\n const resultData = (_a = result.data) !== null && _a !== void 0 ? _a : [];\n this._rateLimit = response.rateLimit;\n if (!this._realData.data) {\n this._realData.data = [];\n }\n if (isNextPage) {\n this._realData.meta.result_count += result.meta.result_count;\n this._realData.meta.next_token = result.meta.next_token;\n this._realData.data.push(...resultData);\n }\n else {\n this._realData.meta.result_count += result.meta.result_count;\n this._realData.meta.previous_token = result.meta.previous_token;\n this._realData.data.unshift(...resultData);\n }\n this.updateIncludes(result);\n }\n getNextQueryParams(maxResults) {\n this.assertUsable();\n return {\n ...this.injectQueryParams(maxResults),\n pagination_token: this._realData.meta.next_token,\n };\n }\n getPreviousQueryParams(maxResults) {\n this.assertUsable();\n return {\n ...this.injectQueryParams(maxResults),\n pagination_token: this._realData.meta.previous_token,\n };\n }\n getPageLengthFromRequest(result) {\n var _a, _b;\n return (_b = (_a = result.data.data) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;\n }\n isFetchLastOver(result) {\n var _a;\n return !((_a = result.data.data) === null || _a === void 0 ? void 0 : _a.length) || !this.canFetchNextPage(result.data);\n }\n canFetchNextPage(result) {\n var _a;\n return !!((_a = result.meta) === null || _a === void 0 ? void 0 : _a.next_token);\n }\n}\nexports.TimelineV2Paginator = TimelineV2Paginator;\n",
60
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TweetV2ListTweetsPaginator = exports.TweetV2UserLikedTweetsPaginator = exports.TweetBookmarksTimelineV2Paginator = exports.TweetUserMentionTimelineV2Paginator = exports.TweetUserTimelineV2Paginator = exports.TweetHomeTimelineV2Paginator = exports.QuotedTweetsTimelineV2Paginator = exports.TweetSearchAllV2Paginator = exports.TweetSearchRecentV2Paginator = void 0;\nconst v2_paginator_1 = require(\"./v2.paginator\");\n/** A generic PreviousableTwitterPaginator able to consume TweetV2 timelines with since_id, until_id and next_token (when available). */\nclass TweetTimelineV2Paginator extends v2_paginator_1.TwitterV2Paginator {\n refreshInstanceFromResult(response, isNextPage) {\n var _a;\n const result = response.data;\n const resultData = (_a = result.data) !== null && _a !== void 0 ? _a : [];\n this._rateLimit = response.rateLimit;\n if (!this._realData.data) {\n this._realData.data = [];\n }\n if (isNextPage) {\n this._realData.meta.oldest_id = result.meta.oldest_id;\n this._realData.meta.result_count += result.meta.result_count;\n this._realData.meta.next_token = result.meta.next_token;\n this._realData.data.push(...resultData);\n }\n else {\n this._realData.meta.newest_id = result.meta.newest_id;\n this._realData.meta.result_count += result.meta.result_count;\n this._realData.data.unshift(...resultData);\n }\n this.updateIncludes(result);\n }\n getNextQueryParams(maxResults) {\n this.assertUsable();\n const params = { ...this.injectQueryParams(maxResults) };\n if (this._realData.meta.next_token) {\n params.next_token = this._realData.meta.next_token;\n }\n else {\n if (params.start_time) {\n // until_id and start_time are forbidden together for some reason, so convert start_time to a since_id.\n params.since_id = this.dateStringToSnowflakeId(params.start_time);\n delete params.start_time;\n }\n if (params.end_time) {\n // until_id overrides end_time, so delete it\n delete params.end_time;\n }\n params.until_id = this._realData.meta.oldest_id;\n }\n return params;\n }\n getPreviousQueryParams(maxResults) {\n this.assertUsable();\n return {\n ...this.injectQueryParams(maxResults),\n since_id: this._realData.meta.newest_id,\n };\n }\n getPageLengthFromRequest(result) {\n var _a, _b;\n return (_b = (_a = result.data.data) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;\n }\n isFetchLastOver(result) {\n var _a;\n return !((_a = result.data.data) === null || _a === void 0 ? void 0 : _a.length) || !this.canFetchNextPage(result.data);\n }\n canFetchNextPage(result) {\n return !!result.meta.next_token;\n }\n getItemArray() {\n return this.tweets;\n }\n dateStringToSnowflakeId(dateStr) {\n const TWITTER_START_EPOCH = BigInt('1288834974657');\n const date = new Date(dateStr);\n if (isNaN(date.valueOf())) {\n throw new Error('Unable to convert start_time/end_time to a valid date. A ISO 8601 DateTime is excepted, please check your input.');\n }\n const dateTimestamp = BigInt(date.valueOf());\n return ((dateTimestamp - TWITTER_START_EPOCH) << BigInt('22')).toString();\n }\n /**\n * Tweets returned by paginator.\n */\n get tweets() {\n var _a;\n return (_a = this._realData.data) !== null && _a !== void 0 ? _a : [];\n }\n get meta() {\n return super.meta;\n }\n}\n/** A generic PreviousableTwitterPaginator able to consume TweetV2 timelines with pagination_tokens. */\nclass TweetPaginableTimelineV2Paginator extends v2_paginator_1.TimelineV2Paginator {\n refreshInstanceFromResult(response, isNextPage) {\n super.refreshInstanceFromResult(response, isNextPage);\n const result = response.data;\n if (isNextPage) {\n this._realData.meta.oldest_id = result.meta.oldest_id;\n }\n else {\n this._realData.meta.newest_id = result.meta.newest_id;\n }\n }\n getItemArray() {\n return this.tweets;\n }\n /**\n * Tweets returned by paginator.\n */\n get tweets() {\n var _a;\n return (_a = this._realData.data) !== null && _a !== void 0 ? _a : [];\n }\n get meta() {\n return super.meta;\n }\n}\n// ----------------\n// - Tweet search -\n// ----------------\nclass TweetSearchRecentV2Paginator extends TweetTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'tweets/search/recent';\n }\n}\nexports.TweetSearchRecentV2Paginator = TweetSearchRecentV2Paginator;\nclass TweetSearchAllV2Paginator extends TweetTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'tweets/search/all';\n }\n}\nexports.TweetSearchAllV2Paginator = TweetSearchAllV2Paginator;\nclass QuotedTweetsTimelineV2Paginator extends TweetPaginableTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'tweets/:id/quote_tweets';\n }\n}\nexports.QuotedTweetsTimelineV2Paginator = QuotedTweetsTimelineV2Paginator;\n// -----------------\n// - Home timeline -\n// -----------------\nclass TweetHomeTimelineV2Paginator extends TweetPaginableTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/timelines/reverse_chronological';\n }\n}\nexports.TweetHomeTimelineV2Paginator = TweetHomeTimelineV2Paginator;\nclass TweetUserTimelineV2Paginator extends TweetPaginableTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/tweets';\n }\n}\nexports.TweetUserTimelineV2Paginator = TweetUserTimelineV2Paginator;\nclass TweetUserMentionTimelineV2Paginator extends TweetPaginableTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/mentions';\n }\n}\nexports.TweetUserMentionTimelineV2Paginator = TweetUserMentionTimelineV2Paginator;\n// -------------\n// - Bookmarks -\n// -------------\nclass TweetBookmarksTimelineV2Paginator extends TweetPaginableTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/bookmarks';\n }\n}\nexports.TweetBookmarksTimelineV2Paginator = TweetBookmarksTimelineV2Paginator;\n// ---------------------------------------------------------------------------------\n// - Tweet lists (consume tweets with pagination tokens instead of since/until id) -\n// ---------------------------------------------------------------------------------\n/** A generic TwitterPaginator able to consume TweetV2 timelines. */\nclass TweetListV2Paginator extends v2_paginator_1.TimelineV2Paginator {\n /**\n * Tweets returned by paginator.\n */\n get tweets() {\n var _a;\n return (_a = this._realData.data) !== null && _a !== void 0 ? _a : [];\n }\n get meta() {\n return super.meta;\n }\n getItemArray() {\n return this.tweets;\n }\n}\nclass TweetV2UserLikedTweetsPaginator extends TweetListV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/liked_tweets';\n }\n}\nexports.TweetV2UserLikedTweetsPaginator = TweetV2UserLikedTweetsPaginator;\nclass TweetV2ListTweetsPaginator extends TweetListV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'lists/:id/tweets';\n }\n}\nexports.TweetV2ListTweetsPaginator = TweetV2ListTweetsPaginator;\n",
61
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TweetRetweetersUsersV2Paginator = exports.TweetLikingUsersV2Paginator = exports.UserListFollowersV2Paginator = exports.UserListMembersV2Paginator = exports.UserFollowingV2Paginator = exports.UserFollowersV2Paginator = exports.UserMutingUsersV2Paginator = exports.UserBlockingUsersV2Paginator = void 0;\nconst v2_paginator_1 = require(\"./v2.paginator\");\n/** A generic PreviousableTwitterPaginator able to consume UserV2 timelines. */\nclass UserTimelineV2Paginator extends v2_paginator_1.TimelineV2Paginator {\n getItemArray() {\n return this.users;\n }\n /**\n * Users returned by paginator.\n */\n get users() {\n var _a;\n return (_a = this._realData.data) !== null && _a !== void 0 ? _a : [];\n }\n get meta() {\n return super.meta;\n }\n}\nclass UserBlockingUsersV2Paginator extends UserTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/blocking';\n }\n}\nexports.UserBlockingUsersV2Paginator = UserBlockingUsersV2Paginator;\nclass UserMutingUsersV2Paginator extends UserTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/muting';\n }\n}\nexports.UserMutingUsersV2Paginator = UserMutingUsersV2Paginator;\nclass UserFollowersV2Paginator extends UserTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/followers';\n }\n}\nexports.UserFollowersV2Paginator = UserFollowersV2Paginator;\nclass UserFollowingV2Paginator extends UserTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/following';\n }\n}\nexports.UserFollowingV2Paginator = UserFollowingV2Paginator;\nclass UserListMembersV2Paginator extends UserTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'lists/:id/members';\n }\n}\nexports.UserListMembersV2Paginator = UserListMembersV2Paginator;\nclass UserListFollowersV2Paginator extends UserTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'lists/:id/followers';\n }\n}\nexports.UserListFollowersV2Paginator = UserListFollowersV2Paginator;\nclass TweetLikingUsersV2Paginator extends UserTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'tweets/:id/liking_users';\n }\n}\nexports.TweetLikingUsersV2Paginator = TweetLikingUsersV2Paginator;\nclass TweetRetweetersUsersV2Paginator extends UserTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'tweets/:id/retweeted_by';\n }\n}\nexports.TweetRetweetersUsersV2Paginator = TweetRetweetersUsersV2Paginator;\n",
62
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UserListFollowedV2Paginator = exports.UserListMembershipsV2Paginator = exports.UserOwnedListsV2Paginator = void 0;\nconst v2_paginator_1 = require(\"./v2.paginator\");\nclass ListTimelineV2Paginator extends v2_paginator_1.TimelineV2Paginator {\n getItemArray() {\n return this.lists;\n }\n /**\n * Lists returned by paginator.\n */\n get lists() {\n var _a;\n return (_a = this._realData.data) !== null && _a !== void 0 ? _a : [];\n }\n get meta() {\n return super.meta;\n }\n}\nclass UserOwnedListsV2Paginator extends ListTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/owned_lists';\n }\n}\nexports.UserOwnedListsV2Paginator = UserOwnedListsV2Paginator;\nclass UserListMembershipsV2Paginator extends ListTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/list_memberships';\n }\n}\nexports.UserListMembershipsV2Paginator = UserListMembershipsV2Paginator;\nclass UserListFollowedV2Paginator extends ListTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'users/:id/followed_lists';\n }\n}\nexports.UserListFollowedV2Paginator = UserListFollowedV2Paginator;\n",
63
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./tweet.paginator.v2\"), exports);\n__exportStar(require(\"./TwitterPaginator\"), exports);\n__exportStar(require(\"./dm.paginator.v1\"), exports);\n__exportStar(require(\"./mutes.paginator.v1\"), exports);\n__exportStar(require(\"./tweet.paginator.v1\"), exports);\n__exportStar(require(\"./user.paginator.v1\"), exports);\n__exportStar(require(\"./user.paginator.v2\"), exports);\n__exportStar(require(\"./list.paginator.v1\"), exports);\n__exportStar(require(\"./list.paginator.v2\"), exports);\n__exportStar(require(\"./friends.paginator.v1\"), exports);\n__exportStar(require(\"./followers.paginator.v1\"), exports);\n",
64
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst client_subclient_1 = __importDefault(require(\"../client.subclient\"));\nconst globals_1 = require(\"../globals\");\n/**\n * Base Twitter v2 labs client with only read right.\n */\nclass TwitterApiv2LabsReadOnly extends client_subclient_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_V2_LABS_PREFIX;\n }\n}\nexports.default = TwitterApiv2LabsReadOnly;\n",
65
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConversationDMTimelineV2Paginator = exports.OneToOneDMTimelineV2Paginator = exports.FullDMTimelineV2Paginator = exports.DMTimelineV2Paginator = void 0;\nconst v2_paginator_1 = require(\"./v2.paginator\");\nclass DMTimelineV2Paginator extends v2_paginator_1.TimelineV2Paginator {\n getItemArray() {\n return this.events;\n }\n /**\n * Events returned by paginator.\n */\n get events() {\n var _a;\n return (_a = this._realData.data) !== null && _a !== void 0 ? _a : [];\n }\n get meta() {\n return super.meta;\n }\n}\nexports.DMTimelineV2Paginator = DMTimelineV2Paginator;\nclass FullDMTimelineV2Paginator extends DMTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'dm_events';\n }\n}\nexports.FullDMTimelineV2Paginator = FullDMTimelineV2Paginator;\nclass OneToOneDMTimelineV2Paginator extends DMTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'dm_conversations/with/:participant_id/dm_events';\n }\n}\nexports.OneToOneDMTimelineV2Paginator = OneToOneDMTimelineV2Paginator;\nclass ConversationDMTimelineV2Paginator extends DMTimelineV2Paginator {\n constructor() {\n super(...arguments);\n this._endpoint = 'dm_conversations/:dm_conversation_id/dm_events';\n }\n}\nexports.ConversationDMTimelineV2Paginator = ConversationDMTimelineV2Paginator;\n",
66
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst client_subclient_1 = __importDefault(require(\"../client.subclient\"));\nconst globals_1 = require(\"../globals\");\nconst paginators_1 = require(\"../paginators\");\nconst client_v2_labs_read_1 = __importDefault(require(\"../v2-labs/client.v2.labs.read\"));\nconst user_paginator_v2_1 = require(\"../paginators/user.paginator.v2\");\nconst helpers_1 = require(\"../helpers\");\nconst dm_paginator_v2_1 = require(\"../paginators/dm.paginator.v2\");\n/**\n * Base Twitter v2 client with only read right.\n */\nclass TwitterApiv2ReadOnly extends client_subclient_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_V2_PREFIX;\n }\n /* Sub-clients */\n /**\n * Get a client for v2 labs endpoints.\n */\n get labs() {\n if (this._labs)\n return this._labs;\n return this._labs = new client_v2_labs_read_1.default(this);\n }\n async search(queryOrOptions, options = {}) {\n const queryParams = typeof queryOrOptions === 'string' ?\n { ...options, query: queryOrOptions } :\n { ...queryOrOptions };\n const initialRq = await this.get('tweets/search/recent', queryParams, { fullResponse: true });\n return new paginators_1.TweetSearchRecentV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * The full-archive search endpoint returns the complete history of public Tweets matching a search query;\n * since the first Tweet was created March 26, 2006.\n *\n * This endpoint is only available to those users who have been approved for the Academic Research product track.\n * https://developer.x.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-all\n */\n async searchAll(query, options = {}) {\n const queryParams = { ...options, query };\n const initialRq = await this.get('tweets/search/all', queryParams, { fullResponse: true });\n return new paginators_1.TweetSearchAllV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams,\n });\n }\n /**\n * Returns a variety of information about a single Tweet specified by the requested ID.\n * https://developer.x.com/en/docs/twitter-api/tweets/lookup/api-reference/get-tweets-id\n *\n * OAuth2 scope: `users.read`, `tweet.read`\n */\n singleTweet(tweetId, options = {}) {\n return this.get('tweets/:id', options, { params: { id: tweetId } });\n }\n /**\n * Returns a variety of information about tweets specified by list of IDs.\n * https://developer.x.com/en/docs/twitter-api/tweets/lookup/api-reference/get-tweets\n *\n * OAuth2 scope: `users.read`, `tweet.read`\n */\n tweets(tweetIds, options = {}) {\n return this.get('tweets', { ids: tweetIds, ...options });\n }\n /**\n * The recent Tweet counts endpoint returns count of Tweets from the last seven days that match a search query.\n * OAuth2 Bearer auth only.\n * https://developer.x.com/en/docs/twitter-api/tweets/counts/api-reference/get-tweets-counts-recent\n */\n tweetCountRecent(query, options = {}) {\n return this.get('tweets/counts/recent', { query, ...options });\n }\n /**\n * This endpoint is only available to those users who have been approved for the Academic Research product track.\n * The full-archive search endpoint returns the complete history of public Tweets matching a search query;\n * since the first Tweet was created March 26, 2006.\n * OAuth2 Bearer auth only.\n * **This endpoint has pagination, yet it is not supported by bundled paginators. Use `next_token` to fetch next page.**\n * https://developer.x.com/en/docs/twitter-api/tweets/counts/api-reference/get-tweets-counts-all\n */\n tweetCountAll(query, options = {}) {\n return this.get('tweets/counts/all', { query, ...options });\n }\n async tweetRetweetedBy(tweetId, options = {}) {\n const { asPaginator, ...parameters } = options;\n const initialRq = await this.get('tweets/:id/retweeted_by', parameters, {\n fullResponse: true,\n params: { id: tweetId },\n });\n if (!asPaginator) {\n return initialRq.data;\n }\n return new user_paginator_v2_1.TweetRetweetersUsersV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: parameters,\n sharedParams: { id: tweetId },\n });\n }\n async tweetLikedBy(tweetId, options = {}) {\n const { asPaginator, ...parameters } = options;\n const initialRq = await this.get('tweets/:id/liking_users', parameters, {\n fullResponse: true,\n params: { id: tweetId },\n });\n if (!asPaginator) {\n return initialRq.data;\n }\n return new user_paginator_v2_1.TweetLikingUsersV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: parameters,\n sharedParams: { id: tweetId },\n });\n }\n /**\n * Allows you to retrieve a collection of the most recent Tweets and Retweets posted by you and users you follow, also known as home timeline.\n * This endpoint returns up to the last 3200 Tweets.\n * https://developer.x.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-reverse-chronological\n *\n * OAuth 2 scopes: `tweet.read` `users.read`\n */\n async homeTimeline(options = {}) {\n const meUser = await this.getCurrentUserV2Object();\n const initialRq = await this.get('users/:id/timelines/reverse_chronological', options, {\n fullResponse: true,\n params: { id: meUser.data.id },\n });\n return new paginators_1.TweetHomeTimelineV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: options,\n sharedParams: { id: meUser.data.id },\n });\n }\n /**\n * Returns Tweets composed by a single user, specified by the requested user ID.\n * By default, the most recent ten Tweets are returned per request.\n * Using pagination, the most recent 3,200 Tweets can be retrieved.\n * https://developer.x.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-tweets\n */\n async userTimeline(userId, options = {}) {\n const initialRq = await this.get('users/:id/tweets', options, {\n fullResponse: true,\n params: { id: userId },\n });\n return new paginators_1.TweetUserTimelineV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: options,\n sharedParams: { id: userId },\n });\n }\n /**\n * Returns Tweets mentioning a single user specified by the requested user ID.\n * By default, the most recent ten Tweets are returned per request.\n * Using pagination, up to the most recent 800 Tweets can be retrieved.\n * https://developer.x.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-mentions\n */\n async userMentionTimeline(userId, options = {}) {\n const initialRq = await this.get('users/:id/mentions', options, {\n fullResponse: true,\n params: { id: userId },\n });\n return new paginators_1.TweetUserMentionTimelineV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: options,\n sharedParams: { id: userId },\n });\n }\n /**\n * Returns Quote Tweets for a Tweet specified by the requested Tweet ID.\n * https://developer.x.com/en/docs/twitter-api/tweets/quote-tweets/api-reference/get-tweets-id-quote_tweets\n *\n * OAuth2 scopes: `users.read` `tweet.read`\n */\n async quotes(tweetId, options = {}) {\n const initialRq = await this.get('tweets/:id/quote_tweets', options, {\n fullResponse: true,\n params: { id: tweetId },\n });\n return new paginators_1.QuotedTweetsTimelineV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: options,\n sharedParams: { id: tweetId },\n });\n }\n /* Bookmarks */\n /**\n * Allows you to get information about a authenticated user’s 800 most recent bookmarked Tweets.\n * https://developer.x.com/en/docs/twitter-api/tweets/bookmarks/api-reference/get-users-id-bookmarks\n *\n * OAuth2 scopes: `users.read` `tweet.read` `bookmark.read`\n */\n async bookmarks(options = {}) {\n const user = await this.getCurrentUserV2Object();\n const initialRq = await this.get('users/:id/bookmarks', options, {\n fullResponse: true,\n params: { id: user.data.id },\n });\n return new paginators_1.TweetBookmarksTimelineV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: options,\n sharedParams: { id: user.data.id },\n });\n }\n /* Users */\n /**\n * Returns information about an authorized user.\n * https://developer.x.com/en/docs/twitter-api/users/lookup/api-reference/get-users-me\n *\n * OAuth2 scopes: `tweet.read` & `users.read`\n */\n me(options = {}) {\n return this.get('users/me', options);\n }\n /**\n * Returns a variety of information about a single user specified by the requested ID.\n * https://developer.x.com/en/docs/twitter-api/users/lookup/api-reference/get-users-id\n */\n user(userId, options = {}) {\n return this.get('users/:id', options, { params: { id: userId } });\n }\n /**\n * Returns a variety of information about one or more users specified by the requested IDs.\n * https://developer.x.com/en/docs/twitter-api/users/lookup/api-reference/get-users\n */\n users(userIds, options = {}) {\n const ids = Array.isArray(userIds) ? userIds.join(',') : userIds;\n return this.get('users', { ...options, ids });\n }\n /**\n * Returns a variety of information about a single user specified by their username.\n * https://developer.x.com/en/docs/twitter-api/users/lookup/api-reference/get-users-by-username-username\n */\n userByUsername(username, options = {}) {\n return this.get('users/by/username/:username', options, { params: { username } });\n }\n /**\n * Returns a variety of information about one or more users specified by their usernames.\n * https://developer.x.com/en/docs/twitter-api/users/lookup/api-reference/get-users-by\n *\n * OAuth2 scope: `users.read`, `tweet.read`\n */\n usersByUsernames(usernames, options = {}) {\n usernames = Array.isArray(usernames) ? usernames.join(',') : usernames;\n return this.get('users/by', { ...options, usernames });\n }\n async followers(userId, options = {}) {\n const { asPaginator, ...parameters } = options;\n const params = { id: userId };\n if (!asPaginator) {\n return this.get('users/:id/followers', parameters, { params });\n }\n const initialRq = await this.get('users/:id/followers', parameters, { fullResponse: true, params });\n return new user_paginator_v2_1.UserFollowersV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: parameters,\n sharedParams: params,\n });\n }\n async following(userId, options = {}) {\n const { asPaginator, ...parameters } = options;\n const params = { id: userId };\n if (!asPaginator) {\n return this.get('users/:id/following', parameters, { params });\n }\n const initialRq = await this.get('users/:id/following', parameters, { fullResponse: true, params });\n return new user_paginator_v2_1.UserFollowingV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: parameters,\n sharedParams: params,\n });\n }\n /**\n * Allows you to get information about a user’s liked Tweets.\n * https://developer.x.com/en/docs/twitter-api/tweets/likes/api-reference/get-users-id-liked_tweets\n */\n async userLikedTweets(userId, options = {}) {\n const params = { id: userId };\n const initialRq = await this.get('users/:id/liked_tweets', options, { fullResponse: true, params });\n return new paginators_1.TweetV2UserLikedTweetsPaginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /**\n * Returns a list of users who are blocked by the authenticating user.\n * https://developer.x.com/en/docs/twitter-api/users/blocks/api-reference/get-users-blocking\n */\n async userBlockingUsers(userId, options = {}) {\n const params = { id: userId };\n const initialRq = await this.get('users/:id/blocking', options, { fullResponse: true, params });\n return new user_paginator_v2_1.UserBlockingUsersV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /**\n * Returns a list of users who are muted by the authenticating user.\n * https://developer.x.com/en/docs/twitter-api/users/mutes/api-reference/get-users-muting\n */\n async userMutingUsers(userId, options = {}) {\n const params = { id: userId };\n const initialRq = await this.get('users/:id/muting', options, { fullResponse: true, params });\n return new user_paginator_v2_1.UserMutingUsersV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /* Lists */\n /**\n * Returns the details of a specified List.\n * https://developer.x.com/en/docs/twitter-api/lists/list-lookup/api-reference/get-lists-id\n */\n list(id, options = {}) {\n return this.get('lists/:id', options, { params: { id } });\n }\n /**\n * Returns all Lists owned by the specified user.\n * https://developer.x.com/en/docs/twitter-api/lists/list-lookup/api-reference/get-users-id-owned_lists\n */\n async listsOwned(userId, options = {}) {\n const params = { id: userId };\n const initialRq = await this.get('users/:id/owned_lists', options, { fullResponse: true, params });\n return new paginators_1.UserOwnedListsV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /**\n * Returns all Lists a specified user is a member of.\n * https://developer.x.com/en/docs/twitter-api/lists/list-members/api-reference/get-users-id-list_memberships\n */\n async listMemberships(userId, options = {}) {\n const params = { id: userId };\n const initialRq = await this.get('users/:id/list_memberships', options, { fullResponse: true, params });\n return new paginators_1.UserListMembershipsV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /**\n * Returns all Lists a specified user follows.\n * https://developer.x.com/en/docs/twitter-api/lists/list-follows/api-reference/get-users-id-followed_lists\n */\n async listFollowed(userId, options = {}) {\n const params = { id: userId };\n const initialRq = await this.get('users/:id/followed_lists', options, { fullResponse: true, params });\n return new paginators_1.UserListFollowedV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /**\n * Returns a list of Tweets from the specified List.\n * https://developer.x.com/en/docs/twitter-api/lists/list-tweets/api-reference/get-lists-id-tweets\n */\n async listTweets(listId, options = {}) {\n const params = { id: listId };\n const initialRq = await this.get('lists/:id/tweets', options, { fullResponse: true, params });\n return new paginators_1.TweetV2ListTweetsPaginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /**\n * Returns a list of users who are members of the specified List.\n * https://developer.x.com/en/docs/twitter-api/lists/list-members/api-reference/get-lists-id-members\n */\n async listMembers(listId, options = {}) {\n const params = { id: listId };\n const initialRq = await this.get('lists/:id/members', options, { fullResponse: true, params });\n return new user_paginator_v2_1.UserListMembersV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /**\n * Returns a list of users who are followers of the specified List.\n * https://developer.x.com/en/docs/twitter-api/lists/list-follows/api-reference/get-lists-id-followers\n */\n async listFollowers(listId, options = {}) {\n const params = { id: listId };\n const initialRq = await this.get('lists/:id/followers', options, { fullResponse: true, params });\n return new user_paginator_v2_1.UserListFollowersV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /* Direct messages */\n /**\n * Returns a list of Direct Messages for the authenticated user, both sent and received.\n * Direct Message events are returned in reverse chronological order.\n * Supports retrieving events from the previous 30 days.\n *\n * OAuth 2 scopes: `dm.read`, `tweet.read`, `user.read`\n *\n * https://developer.x.com/en/docs/twitter-api/direct-messages/lookup/api-reference/get-dm_events\n */\n async listDmEvents(options = {}) {\n const initialRq = await this.get('dm_events', options, { fullResponse: true });\n return new dm_paginator_v2_1.FullDMTimelineV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n });\n }\n /**\n * Returns a list of Direct Messages (DM) events within a 1-1 conversation with the user specified in the participant_id path parameter.\n * Messages are returned in reverse chronological order.\n *\n * OAuth 2 scopes: `dm.read`, `tweet.read`, `user.read`\n *\n * https://developer.x.com/en/docs/twitter-api/direct-messages/lookup/api-reference/get-dm_conversations-dm_conversation_id-dm_events\n */\n async listDmEventsWithParticipant(participantId, options = {}) {\n const params = { participant_id: participantId };\n const initialRq = await this.get('dm_conversations/with/:participant_id/dm_events', options, { fullResponse: true, params });\n return new dm_paginator_v2_1.OneToOneDMTimelineV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /**\n * Returns a list of Direct Messages within a conversation specified in the dm_conversation_id path parameter.\n * Messages are returned in reverse chronological order.\n *\n * OAuth 2 scopes: `dm.read`, `tweet.read`, `user.read`\n *\n * https://developer.x.com/en/docs/twitter-api/direct-messages/lookup/api-reference/get-dm_conversations-dm_conversation_id-dm_events\n */\n async listDmEventsOfConversation(dmConversationId, options = {}) {\n const params = { dm_conversation_id: dmConversationId };\n const initialRq = await this.get('dm_conversations/:dm_conversation_id/dm_events', options, { fullResponse: true, params });\n return new dm_paginator_v2_1.ConversationDMTimelineV2Paginator({\n realData: initialRq.data,\n rateLimit: initialRq.rateLimit,\n instance: this,\n queryParams: { ...options },\n sharedParams: params,\n });\n }\n /* Spaces */\n /**\n * Get a single space by ID.\n * https://developer.x.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces-id\n *\n * OAuth2 scopes: `tweet.read`, `users.read`, `space.read`.\n */\n space(spaceId, options = {}) {\n return this.get('spaces/:id', options, { params: { id: spaceId } });\n }\n /**\n * Get spaces using their IDs.\n * https://developer.x.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces\n *\n * OAuth2 scopes: `tweet.read`, `users.read`, `space.read`.\n */\n spaces(spaceIds, options = {}) {\n return this.get('spaces', { ids: spaceIds, ...options });\n }\n /**\n * Get spaces using their creator user ID(s). (no pagination available)\n * https://developer.x.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces-by-creator-ids\n *\n * OAuth2 scopes: `tweet.read`, `users.read`, `space.read`.\n */\n spacesByCreators(creatorIds, options = {}) {\n return this.get('spaces/by/creator_ids', { user_ids: creatorIds, ...options });\n }\n /**\n * Search through spaces using multiple params. (no pagination available)\n * https://developer.x.com/en/docs/twitter-api/spaces/search/api-reference/get-spaces-search\n */\n searchSpaces(options) {\n return this.get('spaces/search', options);\n }\n /**\n * Returns a list of user who purchased a ticket to the requested Space.\n * You must authenticate the request using the Access Token of the creator of the requested Space.\n *\n * **OAuth 2.0 Access Token required**\n *\n * https://developer.x.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces-id-buyers\n *\n * OAuth2 scopes: `tweet.read`, `users.read`, `space.read`.\n */\n spaceBuyers(spaceId, options = {}) {\n return this.get('spaces/:id/buyers', options, { params: { id: spaceId } });\n }\n /**\n * Returns Tweets shared in the requested Spaces.\n * https://developer.x.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces-id-tweets\n *\n * OAuth2 scope: `users.read`, `tweet.read`, `space.read`\n */\n spaceTweets(spaceId, options = {}) {\n return this.get('spaces/:id/tweets', options, { params: { id: spaceId } });\n }\n searchStream({ autoConnect, ...options } = {}) {\n return this.getStream('tweets/search/stream', options, { payloadIsError: helpers_1.isTweetStreamV2ErrorPayload, autoConnect });\n }\n /**\n * Return a list of rules currently active on the streaming endpoint, either as a list or individually.\n * https://developer.x.com/en/docs/twitter-api/tweets/filtered-stream/api-reference/get-tweets-search-stream-rules\n */\n streamRules(options = {}) {\n return this.get('tweets/search/stream/rules', options);\n }\n updateStreamRules(options, query = {}) {\n return this.post('tweets/search/stream/rules', options, { query });\n }\n sampleStream({ autoConnect, ...options } = {}) {\n return this.getStream('tweets/sample/stream', options, { payloadIsError: helpers_1.isTweetStreamV2ErrorPayload, autoConnect });\n }\n sample10Stream({ autoConnect, ...options } = {}) {\n return this.getStream('tweets/sample10/stream', options, { payloadIsError: helpers_1.isTweetStreamV2ErrorPayload, autoConnect });\n }\n /* Batch compliance */\n /**\n * Returns a list of recent compliance jobs.\n * https://developer.x.com/en/docs/twitter-api/compliance/batch-compliance/api-reference/get-compliance-jobs\n */\n complianceJobs(options) {\n return this.get('compliance/jobs', options);\n }\n /**\n * Get a single compliance job with the specified ID.\n * https://developer.x.com/en/docs/twitter-api/compliance/batch-compliance/api-reference/get-compliance-jobs-id\n */\n complianceJob(jobId) {\n return this.get('compliance/jobs/:id', undefined, { params: { id: jobId } });\n }\n /**\n * Creates a new compliance job for Tweet IDs or user IDs, send your file, await result and parse it into an array.\n * You can run one batch job at a time. Returns the created job, but **not the job result!**.\n *\n * You can obtain the result (**after job is completed**) with `.complianceJobResult`.\n * https://developer.x.com/en/docs/twitter-api/compliance/batch-compliance/api-reference/post-compliance-jobs\n */\n async sendComplianceJob(jobParams) {\n const job = await this.post('compliance/jobs', { type: jobParams.type, name: jobParams.name });\n // Send the IDs\n const rawIdsBody = jobParams.ids instanceof Buffer ? jobParams.ids : Buffer.from(jobParams.ids.join('\\n'));\n // Upload the IDs\n await this.put(job.data.upload_url, rawIdsBody, {\n forceBodyMode: 'raw',\n enableAuth: false,\n headers: { 'Content-Type': 'text/plain' },\n prefix: '',\n });\n return job;\n }\n /**\n * Get the result of a running or completed job, obtained through `.complianceJob`, `.complianceJobs` or `.sendComplianceJob`.\n * If job is still running (`in_progress`), it will await until job is completed. **This could be quite long!**\n * https://developer.x.com/en/docs/twitter-api/compliance/batch-compliance/api-reference/post-compliance-jobs\n */\n async complianceJobResult(job) {\n let runningJob = job;\n while (runningJob.status !== 'complete') {\n if (runningJob.status === 'expired' || runningJob.status === 'failed') {\n throw new Error('Job failed to be completed.');\n }\n await new Promise(resolve => setTimeout(resolve, 3500));\n runningJob = (await this.complianceJob(job.id)).data;\n }\n // Download and parse result\n const result = await this.get(job.download_url, undefined, {\n enableAuth: false,\n prefix: '',\n });\n return result\n .trim()\n .split('\\n')\n .filter(line => line)\n .map(line => JSON.parse(line));\n }\n /* Usage */\n /**\n * Allows you to retrieve your project usage.\n *\n * https://developer.x.com/en/docs/x-api/usage/tweets/introduction\n */\n async usage(options = {}) {\n return this.get('usage/tweets', options);\n }\n /**\n * Returns a variety of information about a single Community specified by ID.\n * https://docs.x.com/x-api/communities/communities-lookup-by-community-id\n */\n community(communityId, options = {}) {\n return this.get('communities/:id', options, { params: { id: communityId } });\n }\n /**\n * Search for Communities based on keywords.\n * https://docs.x.com/x-api/communities/search-communities\n */\n searchCommunities(query, options = {}) {\n return this.get('communities/search', { query, ...options });\n }\n}\nexports.default = TwitterApiv2ReadOnly;\n",
67
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst globals_1 = require(\"../globals\");\nconst client_v2_labs_read_1 = __importDefault(require(\"./client.v2.labs.read\"));\n/**\n * Base Twitter v2 labs client with read/write rights.\n */\nclass TwitterApiv2LabsReadWrite extends client_v2_labs_read_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_V2_LABS_PREFIX;\n }\n /**\n * Get a client with only read rights.\n */\n get readOnly() {\n return this;\n }\n}\nexports.default = TwitterApiv2LabsReadWrite;\n",
68
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst globals_1 = require(\"../globals\");\nconst client_v2_read_1 = __importDefault(require(\"./client.v2.read\"));\nconst client_v2_labs_write_1 = __importDefault(require(\"../v2-labs/client.v2.labs.write\"));\n/**\n * Base Twitter v2 client with read/write rights.\n */\nclass TwitterApiv2ReadWrite extends client_v2_read_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_V2_PREFIX;\n }\n /* Sub-clients */\n /**\n * Get a client with only read rights.\n */\n get readOnly() {\n return this;\n }\n /**\n * Get a client for v2 labs endpoints.\n */\n get labs() {\n if (this._labs)\n return this._labs;\n return this._labs = new client_v2_labs_write_1.default(this);\n }\n /* Tweets */\n /**\n * Hides or unhides a reply to a Tweet.\n * https://developer.x.com/en/docs/twitter-api/tweets/hide-replies/api-reference/put-tweets-id-hidden\n */\n hideReply(tweetId, makeHidden) {\n return this.put('tweets/:id/hidden', { hidden: makeHidden }, { params: { id: tweetId } });\n }\n /**\n * Causes the user ID identified in the path parameter to Like the target Tweet.\n * https://developer.x.com/en/docs/twitter-api/tweets/likes/api-reference/post-users-user_id-likes\n *\n * **Note**: You must specify the currently logged user ID ; you can obtain it through v1.1 API.\n */\n like(loggedUserId, targetTweetId) {\n return this.post('users/:id/likes', { tweet_id: targetTweetId }, { params: { id: loggedUserId } });\n }\n /**\n * Allows a user or authenticated user ID to unlike a Tweet.\n * The request succeeds with no action when the user sends a request to a user they're not liking the Tweet or have already unliked the Tweet.\n * https://developer.x.com/en/docs/twitter-api/tweets/likes/api-reference/delete-users-id-likes-tweet_id\n *\n * **Note**: You must specify the currently logged user ID ; you can obtain it through v1.1 API.\n */\n unlike(loggedUserId, targetTweetId) {\n return this.delete('users/:id/likes/:tweet_id', undefined, {\n params: { id: loggedUserId, tweet_id: targetTweetId },\n });\n }\n /**\n * Causes the user ID identified in the path parameter to Retweet the target Tweet.\n * https://developer.x.com/en/docs/twitter-api/tweets/retweets/api-reference/post-users-id-retweets\n *\n * **Note**: You must specify the currently logged user ID ; you can obtain it through v1.1 API.\n */\n retweet(loggedUserId, targetTweetId) {\n return this.post('users/:id/retweets', { tweet_id: targetTweetId }, { params: { id: loggedUserId } });\n }\n /**\n * Allows a user or authenticated user ID to remove the Retweet of a Tweet.\n * The request succeeds with no action when the user sends a request to a user they're not Retweeting the Tweet or have already removed the Retweet of.\n * https://developer.x.com/en/docs/twitter-api/tweets/retweets/api-reference/delete-users-id-retweets-tweet_id\n *\n * **Note**: You must specify the currently logged user ID ; you can obtain it through v1.1 API.\n */\n unretweet(loggedUserId, targetTweetId) {\n return this.delete('users/:id/retweets/:tweet_id', undefined, {\n params: { id: loggedUserId, tweet_id: targetTweetId },\n });\n }\n tweet(status, payload = {}) {\n if (typeof status === 'object') {\n payload = status;\n }\n else {\n payload = { text: status, ...payload };\n }\n return this.post('tweets', payload);\n }\n /**\n * Uploads media to Twitter using chunked upload.\n * https://docs.x.com/x-api/media/media-upload\n *\n * @param media The media buffer to upload\n * @param options Upload options including media type and category, and additional owners\n * @param chunkSize Size of each chunk in bytes (default: 1MB)\n * @returns The media ID of the uploaded media\n */\n async uploadMedia(media, options, chunkSize = 1024 * 1024) {\n let media_category = options.media_category;\n // If no media category is provided, try to infer it from the media type\n if (!options.media_category) {\n if (options.media_type.includes('gif')) {\n media_category = 'tweet_gif';\n }\n else if (options.media_type.includes('image')) {\n media_category = 'tweet_image';\n }\n else if (options.media_type.includes('video')) {\n media_category = 'tweet_video';\n }\n }\n const initArguments = {\n additional_owners: options.additional_owners,\n media_type: options.media_type,\n total_bytes: media.length,\n media_category,\n };\n const initResponse = await this.post('media/upload/initialize', initArguments);\n const mediaId = initResponse.data.id;\n const chunksCount = Math.ceil(media.length / chunkSize);\n const mediaArray = new Uint8Array(media);\n for (let i = 0; i < chunksCount; i++) {\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, media.length);\n const mediaChunk = mediaArray.slice(start, end);\n const chunkedBuffer = Buffer.from(mediaChunk);\n const appendArguments = {\n segment_index: i,\n media: chunkedBuffer,\n };\n await this.post(`media/upload/${mediaId}/append`, appendArguments, { forceBodyMode: 'form-data' });\n }\n const finalizeResponse = await this.post(`media/upload/${mediaId}/finalize`);\n if (finalizeResponse.data.processing_info) {\n await this.waitForMediaProcessing(mediaId);\n }\n return mediaId;\n }\n async waitForMediaProcessing(mediaId) {\n var _a;\n const response = await this.get('media/upload', {\n command: 'STATUS',\n media_id: mediaId,\n });\n const info = response.data.processing_info;\n if (!info)\n return;\n switch (info.state) {\n case 'succeeded':\n return;\n case 'failed':\n throw new Error(`Media processing failed: ${(_a = info.error) === null || _a === void 0 ? void 0 : _a.message}`);\n case 'pending':\n case 'in_progress': {\n const waitTime = info === null || info === void 0 ? void 0 : info.check_after_secs;\n if (waitTime && waitTime > 0) {\n await new Promise(resolve => setTimeout(resolve, waitTime * 1000));\n await this.waitForMediaProcessing(mediaId);\n }\n }\n }\n }\n /**\n * Creates the metadata for media to be uploaded.\n * This feature is currently only supported for images and GIFs.\n * https://docs.x.com/x-api/media/metadata-create\n */\n createMediaMetadata(mediaId, metadata) {\n return this.post('media/metadata', { id: mediaId, metadata });\n }\n /**\n * Reply to a Tweet on behalf of an authenticated user.\n * https://developer.x.com/en/docs/twitter-api/tweets/manage-tweets/api-reference/post-tweets\n */\n reply(status, toTweetId, payload = {}) {\n var _a;\n const reply = { in_reply_to_tweet_id: toTweetId, ...(_a = payload.reply) !== null && _a !== void 0 ? _a : {} };\n return this.post('tweets', { text: status, ...payload, reply });\n }\n /**\n * Quote an existing Tweet on behalf of an authenticated user.\n * https://developer.x.com/en/docs/twitter-api/tweets/manage-tweets/api-reference/post-tweets\n */\n quote(status, quotedTweetId, payload = {}) {\n return this.tweet(status, { ...payload, quote_tweet_id: quotedTweetId });\n }\n /**\n * Post a series of tweets.\n * https://developer.x.com/en/docs/twitter-api/tweets/manage-tweets/api-reference/post-tweets\n */\n async tweetThread(tweets) {\n var _a, _b;\n const postedTweets = [];\n for (const tweet of tweets) {\n // Retrieve the last sent tweet\n const lastTweet = postedTweets.length ? postedTweets[postedTweets.length - 1] : null;\n // Build the tweet query params\n const queryParams = { ...(typeof tweet === 'string' ? ({ text: tweet }) : tweet) };\n // Reply to an existing tweet if needed\n const inReplyToId = lastTweet ? lastTweet.data.id : (_a = queryParams.reply) === null || _a === void 0 ? void 0 : _a.in_reply_to_tweet_id;\n const status = (_b = queryParams.text) !== null && _b !== void 0 ? _b : '';\n if (inReplyToId) {\n postedTweets.push(await this.reply(status, inReplyToId, queryParams));\n }\n else {\n postedTweets.push(await this.tweet(status, queryParams));\n }\n }\n return postedTweets;\n }\n /**\n * Allows a user or authenticated user ID to delete a Tweet\n * https://developer.x.com/en/docs/twitter-api/tweets/manage-tweets/api-reference/delete-tweets-id\n */\n deleteTweet(tweetId) {\n return this.delete('tweets/:id', undefined, {\n params: {\n id: tweetId,\n },\n });\n }\n /* Bookmarks */\n /**\n * Causes the user ID of an authenticated user identified in the path parameter to Bookmark the target Tweet provided in the request body.\n * https://developer.x.com/en/docs/twitter-api/tweets/bookmarks/api-reference/post-users-id-bookmarks\n *\n * OAuth2 scopes: `users.read` `tweet.read` `bookmark.write`\n */\n async bookmark(tweetId) {\n const user = await this.getCurrentUserV2Object();\n return this.post('users/:id/bookmarks', { tweet_id: tweetId }, { params: { id: user.data.id } });\n }\n /**\n * Allows a user or authenticated user ID to remove a Bookmark of a Tweet.\n * https://developer.x.com/en/docs/twitter-api/tweets/bookmarks/api-reference/delete-users-id-bookmarks-tweet_id\n *\n * OAuth2 scopes: `users.read` `tweet.read` `bookmark.write`\n */\n async deleteBookmark(tweetId) {\n const user = await this.getCurrentUserV2Object();\n return this.delete('users/:id/bookmarks/:tweet_id', undefined, { params: { id: user.data.id, tweet_id: tweetId } });\n }\n /* Users */\n /**\n * Allows a user ID to follow another user.\n * If the target user does not have public Tweets, this endpoint will send a follow request.\n * https://developer.x.com/en/docs/twitter-api/users/follows/api-reference/post-users-source_user_id-following\n *\n * OAuth2 scope: `follows.write`\n *\n * **Note**: You must specify the currently logged user ID ; you can obtain it through v1.1 API.\n */\n follow(loggedUserId, targetUserId) {\n return this.post('users/:id/following', { target_user_id: targetUserId }, { params: { id: loggedUserId } });\n }\n /**\n * Allows a user ID to unfollow another user.\n * https://developer.x.com/en/docs/twitter-api/users/follows/api-reference/delete-users-source_id-following\n *\n * OAuth2 scope: `follows.write`\n *\n * **Note**: You must specify the currently logged user ID ; you can obtain it through v1.1 API.\n */\n unfollow(loggedUserId, targetUserId) {\n return this.delete('users/:source_user_id/following/:target_user_id', undefined, {\n params: { source_user_id: loggedUserId, target_user_id: targetUserId },\n });\n }\n /**\n * Causes the user (in the path) to block the target user.\n * The user (in the path) must match the user context authorizing the request.\n * https://developer.x.com/en/docs/twitter-api/users/blocks/api-reference/post-users-user_id-blocking\n *\n * **Note**: You must specify the currently logged user ID; you can obtain it through v1.1 API.\n */\n block(loggedUserId, targetUserId) {\n return this.post('users/:id/blocking', { target_user_id: targetUserId }, { params: { id: loggedUserId } });\n }\n /**\n * Allows a user or authenticated user ID to unblock another user.\n * https://developer.x.com/en/docs/twitter-api/users/blocks/api-reference/delete-users-user_id-blocking\n *\n * **Note**: You must specify the currently logged user ID ; you can obtain it through v1.1 API.\n */\n unblock(loggedUserId, targetUserId) {\n return this.delete('users/:source_user_id/blocking/:target_user_id', undefined, {\n params: { source_user_id: loggedUserId, target_user_id: targetUserId },\n });\n }\n /**\n * Allows an authenticated user ID to mute the target user.\n * https://developer.x.com/en/docs/twitter-api/users/mutes/api-reference/post-users-user_id-muting\n *\n * **Note**: You must specify the currently logged user ID ; you can obtain it through v1.1 API.\n */\n mute(loggedUserId, targetUserId) {\n return this.post('users/:id/muting', { target_user_id: targetUserId }, { params: { id: loggedUserId } });\n }\n /**\n * Allows an authenticated user ID to unmute the target user.\n * The request succeeds with no action when the user sends a request to a user they're not muting or have already unmuted.\n * https://developer.x.com/en/docs/twitter-api/users/mutes/api-reference/delete-users-user_id-muting\n *\n * **Note**: You must specify the currently logged user ID ; you can obtain it through v1.1 API.\n */\n unmute(loggedUserId, targetUserId) {\n return this.delete('users/:source_user_id/muting/:target_user_id', undefined, {\n params: { source_user_id: loggedUserId, target_user_id: targetUserId },\n });\n }\n /* Lists */\n /**\n * Creates a new list for the authenticated user.\n * https://developer.x.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-lists\n */\n createList(options) {\n return this.post('lists', options);\n }\n /**\n * Updates the specified list. The authenticated user must own the list to be able to update it.\n * https://developer.x.com/en/docs/twitter-api/lists/manage-lists/api-reference/put-lists-id\n */\n updateList(listId, options = {}) {\n return this.put('lists/:id', options, { params: { id: listId } });\n }\n /**\n * Deletes the specified list. The authenticated user must own the list to be able to destroy it.\n * https://developer.x.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id\n */\n removeList(listId) {\n return this.delete('lists/:id', undefined, { params: { id: listId } });\n }\n /**\n * Adds a member to a list.\n * https://developer.x.com/en/docs/twitter-api/lists/list-members/api-reference/post-lists-id-members\n */\n addListMember(listId, userId) {\n return this.post('lists/:id/members', { user_id: userId }, { params: { id: listId } });\n }\n /**\n * Remember a member to a list.\n * https://developer.x.com/en/docs/twitter-api/lists/list-members/api-reference/delete-lists-id-members-user_id\n */\n removeListMember(listId, userId) {\n return this.delete('lists/:id/members/:user_id', undefined, { params: { id: listId, user_id: userId } });\n }\n /**\n * Subscribes the authenticated user to the specified list.\n * https://developer.x.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-users-id-followed-lists\n */\n subscribeToList(loggedUserId, listId) {\n return this.post('users/:id/followed_lists', { list_id: listId }, { params: { id: loggedUserId } });\n }\n /**\n * Unsubscribes the authenticated user to the specified list.\n * https://developer.x.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-users-id-followed-lists-list_id\n */\n unsubscribeOfList(loggedUserId, listId) {\n return this.delete('users/:id/followed_lists/:list_id', undefined, { params: { id: loggedUserId, list_id: listId } });\n }\n /**\n * Enables the authenticated user to pin a List.\n * https://developer.x.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-users-id-pinned-lists\n */\n pinList(loggedUserId, listId) {\n return this.post('users/:id/pinned_lists', { list_id: listId }, { params: { id: loggedUserId } });\n }\n /**\n * Enables the authenticated user to unpin a List.\n * https://developer.x.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-users-id-pinned-lists-list_id\n */\n unpinList(loggedUserId, listId) {\n return this.delete('users/:id/pinned_lists/:list_id', undefined, { params: { id: loggedUserId, list_id: listId } });\n }\n /* Direct messages */\n /**\n * Creates a Direct Message on behalf of an authenticated user, and adds it to the specified conversation.\n * https://developer.x.com/en/docs/twitter-api/direct-messages/manage/api-reference/post-dm_conversations-dm_conversation_id-messages\n */\n sendDmInConversation(conversationId, message) {\n return this.post('dm_conversations/:dm_conversation_id/messages', message, { params: { dm_conversation_id: conversationId } });\n }\n /**\n * Creates a one-to-one Direct Message and adds it to the one-to-one conversation.\n * This method either creates a new one-to-one conversation or retrieves the current conversation and adds the Direct Message to it.\n * https://developer.x.com/en/docs/twitter-api/direct-messages/manage/api-reference/post-dm_conversations-with-participant_id-messages\n */\n sendDmToParticipant(participantId, message) {\n return this.post('dm_conversations/with/:participant_id/messages', message, { params: { participant_id: participantId } });\n }\n /**\n * Creates a new group conversation and adds a Direct Message to it on behalf of an authenticated user.\n * https://developer.x.com/en/docs/twitter-api/direct-messages/manage/api-reference/post-dm_conversations\n */\n createDmConversation(options) {\n return this.post('dm_conversations', options);\n }\n}\nexports.default = TwitterApiv2ReadWrite;\n",
69
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TwitterApiv2Labs = void 0;\nconst globals_1 = require(\"../globals\");\nconst client_v2_labs_write_1 = __importDefault(require(\"./client.v2.labs.write\"));\n/**\n * Twitter v2 labs client with all rights (read/write/DMs)\n */\nclass TwitterApiv2Labs extends client_v2_labs_write_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_V2_LABS_PREFIX;\n }\n /**\n * Get a client with read/write rights.\n */\n get readWrite() {\n return this;\n }\n}\nexports.TwitterApiv2Labs = TwitterApiv2Labs;\nexports.default = TwitterApiv2Labs;\n",
70
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TwitterApiv2 = void 0;\nconst globals_1 = require(\"../globals\");\nconst client_v2_write_1 = __importDefault(require(\"./client.v2.write\"));\nconst client_v2_labs_1 = __importDefault(require(\"../v2-labs/client.v2.labs\"));\n/**\n * Twitter v2 client with all rights (read/write/DMs)\n */\nclass TwitterApiv2 extends client_v2_write_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_V2_PREFIX;\n /** API endpoints */\n }\n /* Sub-clients */\n /**\n * Get a client with read/write rights.\n */\n get readWrite() {\n return this;\n }\n /**\n * Get a client for v2 labs endpoints.\n */\n get labs() {\n if (this._labs)\n return this._labs;\n return this._labs = new client_v2_labs_1.default(this);\n }\n}\nexports.TwitterApiv2 = TwitterApiv2;\nexports.default = TwitterApiv2;\n",
71
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst client_base_1 = __importDefault(require(\"../client.base\"));\nconst client_v1_read_1 = __importDefault(require(\"../v1/client.v1.read\"));\nconst client_v2_read_1 = __importDefault(require(\"../v2/client.v2.read\"));\nconst oauth2_helper_1 = require(\"../client-mixins/oauth2.helper\");\nconst request_param_helper_1 = __importDefault(require(\"../client-mixins/request-param.helper\"));\n/**\n * Twitter v1.1 and v2 API client.\n */\nclass TwitterApiReadOnly extends client_base_1.default {\n /* Direct access to subclients */\n get v1() {\n if (this._v1)\n return this._v1;\n return this._v1 = new client_v1_read_1.default(this);\n }\n get v2() {\n if (this._v2)\n return this._v2;\n return this._v2 = new client_v2_read_1.default(this);\n }\n /**\n * Fetch and cache current user.\n * This method can only be called with a OAuth 1.0a user authentication.\n *\n * You can use this method to test if authentication was successful.\n * Next calls to this methods will use the cached user, unless `forceFetch: true` is given.\n */\n async currentUser(forceFetch = false) {\n return await this.getCurrentUserObject(forceFetch);\n }\n /**\n * Fetch and cache current user.\n * This method can only be called with a OAuth 1.0a or OAuth2 user authentication.\n *\n * This can only be the slimest available `UserV2` object, with only id, name and username properties defined.\n * To get a customized `UserV2Result`, use `.v2.me()`\n *\n * You can use this method to test if authentication was successful.\n * Next calls to this methods will use the cached user, unless `forceFetch: true` is given.\n *\n * OAuth2 scopes: `tweet.read` & `users.read`\n */\n async currentUserV2(forceFetch = false) {\n return await this.getCurrentUserV2Object(forceFetch);\n }\n /* Shortcuts to endpoints */\n search(what, options) {\n return this.v2.search(what, options);\n }\n /* Authentication */\n /**\n * Generate the OAuth request token link for user-based OAuth 1.0 auth.\n *\n * ```ts\n * // Instantiate TwitterApi with consumer keys\n * const client = new TwitterApi({ appKey: 'consumer_key', appSecret: 'consumer_secret' });\n *\n * const tokenRequest = await client.generateAuthLink('oob-or-your-callback-url');\n * // redirect end-user to tokenRequest.url\n *\n * // Save tokenRequest.oauth_token_secret somewhere, it will be needed for next auth step.\n * ```\n */\n async generateAuthLink(oauth_callback = 'oob', { authAccessType, linkMode = 'authenticate', forceLogin, screenName, } = {}) {\n const oauthResult = await this.post('https://api.x.com/oauth/request_token', { oauth_callback, x_auth_access_type: authAccessType });\n let url = `https://api.x.com/oauth/${linkMode}?oauth_token=${encodeURIComponent(oauthResult.oauth_token)}`;\n if (forceLogin !== undefined) {\n url += `&force_login=${encodeURIComponent(forceLogin)}`;\n }\n if (screenName !== undefined) {\n url += `&screen_name=${encodeURIComponent(screenName)}`;\n }\n if (this._requestMaker.hasPlugins()) {\n this._requestMaker.applyPluginMethod('onOAuth1RequestToken', {\n client: this._requestMaker,\n url,\n oauthResult,\n });\n }\n return {\n url,\n ...oauthResult,\n };\n }\n /**\n * Obtain access to user-based OAuth 1.0 auth.\n *\n * After user is redirect from your callback, use obtained oauth_token and oauth_verifier to\n * instantiate the new TwitterApi instance.\n *\n * ```ts\n * // Use the saved oauth_token_secret associated to oauth_token returned by callback\n * const requestClient = new TwitterApi({\n * appKey: 'consumer_key',\n * appSecret: 'consumer_secret',\n * accessToken: 'oauth_token',\n * accessSecret: 'oauth_token_secret'\n * });\n *\n * // Use oauth_verifier obtained from callback request\n * const { client: userClient } = await requestClient.login('oauth_verifier');\n *\n * // {userClient} is a valid {TwitterApi} object you can use for future requests\n * ```\n */\n async login(oauth_verifier) {\n const tokens = this.getActiveTokens();\n if (tokens.type !== 'oauth-1.0a')\n throw new Error('You must setup TwitterApi instance with consumer keys to accept OAuth 1.0 login');\n const oauth_result = await this.post('https://api.x.com/oauth/access_token', { oauth_token: tokens.accessToken, oauth_verifier });\n const client = new this.constructor({\n appKey: tokens.appKey,\n appSecret: tokens.appSecret,\n accessToken: oauth_result.oauth_token,\n accessSecret: oauth_result.oauth_token_secret,\n }, this._requestMaker.clientSettings);\n return {\n accessToken: oauth_result.oauth_token,\n accessSecret: oauth_result.oauth_token_secret,\n userId: oauth_result.user_id,\n screenName: oauth_result.screen_name,\n client,\n };\n }\n /**\n * Enable application-only authentication.\n *\n * To make the request, instantiate TwitterApi with consumer and secret.\n *\n * ```ts\n * const requestClient = new TwitterApi({ appKey: 'consumer', appSecret: 'secret' });\n * const appClient = await requestClient.appLogin();\n *\n * // Use {appClient} to make requests\n * ```\n */\n async appLogin() {\n const tokens = this.getActiveTokens();\n if (tokens.type !== 'oauth-1.0a')\n throw new Error('You must setup TwitterApi instance with consumer keys to accept app-only login');\n // Create a client with Basic authentication\n const basicClient = new this.constructor({ username: tokens.appKey, password: tokens.appSecret }, this._requestMaker.clientSettings);\n const res = await basicClient.post('https://api.x.com/oauth2/token', { grant_type: 'client_credentials' });\n // New object with Bearer token\n return new this.constructor(res.access_token, this._requestMaker.clientSettings);\n }\n /* OAuth 2 user authentication */\n /**\n * Generate the OAuth request token link for user-based OAuth 2.0 auth.\n *\n * - **You can only use v2 API endpoints with this authentication method.**\n * - **You need to specify which scope you want to have when you create your auth link. Make sure it matches your needs.**\n *\n * See https://developer.x.com/en/docs/authentication/oauth-2-0/user-access-token for details.\n *\n * ```ts\n * // Instantiate TwitterApi with client ID\n * const client = new TwitterApi({ clientId: 'yourClientId' });\n *\n * // Generate a link to callback URL that will gives a token with tweet+user read access\n * const link = client.generateOAuth2AuthLink('your-callback-url', { scope: ['tweet.read', 'users.read'] });\n *\n * // Extract props from generate link\n * const { url, state, codeVerifier } = link;\n *\n * // redirect end-user to url\n * // Save `state` and `codeVerifier` somewhere, it will be needed for next auth step.\n * ```\n */\n generateOAuth2AuthLink(redirectUri, options = {}) {\n var _a, _b;\n if (!this._requestMaker.clientId) {\n throw new Error('Twitter API instance is not initialized with client ID. You can find your client ID in Twitter Developer Portal. ' +\n 'Please build an instance with: new TwitterApi({ clientId: \\'<yourClientId>\\' })');\n }\n const state = (_a = options.state) !== null && _a !== void 0 ? _a : oauth2_helper_1.OAuth2Helper.generateRandomString(32);\n const codeVerifier = oauth2_helper_1.OAuth2Helper.getCodeVerifier();\n const codeChallenge = oauth2_helper_1.OAuth2Helper.getCodeChallengeFromVerifier(codeVerifier);\n const rawScope = (_b = options.scope) !== null && _b !== void 0 ? _b : '';\n const scope = Array.isArray(rawScope) ? rawScope.join(' ') : rawScope;\n const url = new URL('https://x.com/i/oauth2/authorize');\n const query = {\n response_type: 'code',\n client_id: this._requestMaker.clientId,\n redirect_uri: redirectUri,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 's256',\n scope,\n };\n request_param_helper_1.default.addQueryParamsToUrl(url, query);\n const result = {\n url: url.toString(),\n state,\n codeVerifier,\n codeChallenge,\n };\n if (this._requestMaker.hasPlugins()) {\n this._requestMaker.applyPluginMethod('onOAuth2RequestToken', {\n client: this._requestMaker,\n result,\n redirectUri,\n });\n }\n return result;\n }\n /**\n * Obtain access to user-based OAuth 2.0 auth.\n *\n * After user is redirect from your callback, use obtained code to\n * instantiate the new TwitterApi instance.\n *\n * You need to obtain `codeVerifier` from a call to `.generateOAuth2AuthLink`.\n *\n * ```ts\n * // Use the saved codeVerifier associated to state (present in query string of callback)\n * const requestClient = new TwitterApi({ clientId: 'yourClientId' });\n *\n * const { client: userClient, refreshToken } = await requestClient.loginWithOAuth2({\n * code: 'codeFromQueryString',\n * // the same URL given to generateOAuth2AuthLink\n * redirectUri,\n * // the verifier returned by generateOAuth2AuthLink\n * codeVerifier,\n * });\n *\n * // {userClient} is a valid {TwitterApi} object you can use for future requests\n * // {refreshToken} is defined if 'offline.access' is in scope.\n * ```\n */\n async loginWithOAuth2({ code, codeVerifier, redirectUri }) {\n if (!this._requestMaker.clientId) {\n throw new Error('Twitter API instance is not initialized with client ID. ' +\n 'Please build an instance with: new TwitterApi({ clientId: \\'<yourClientId>\\' })');\n }\n const accessTokenResult = await this.post('https://api.x.com/2/oauth2/token', {\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code',\n client_id: this._requestMaker.clientId,\n client_secret: this._requestMaker.clientSecret,\n });\n return this.parseOAuth2AccessTokenResult(accessTokenResult);\n }\n /**\n * Obtain a new access token to user-based OAuth 2.0 auth from a refresh token.\n *\n * ```ts\n * const requestClient = new TwitterApi({ clientId: 'yourClientId' });\n *\n * const { client: userClient } = await requestClient.refreshOAuth2Token('refreshToken');\n * // {userClient} is a valid {TwitterApi} object you can use for future requests\n * ```\n */\n async refreshOAuth2Token(refreshToken) {\n if (!this._requestMaker.clientId) {\n throw new Error('Twitter API instance is not initialized with client ID. ' +\n 'Please build an instance with: new TwitterApi({ clientId: \\'<yourClientId>\\' })');\n }\n const accessTokenResult = await this.post('https://api.x.com/2/oauth2/token', {\n refresh_token: refreshToken,\n grant_type: 'refresh_token',\n client_id: this._requestMaker.clientId,\n client_secret: this._requestMaker.clientSecret,\n });\n return this.parseOAuth2AccessTokenResult(accessTokenResult);\n }\n /**\n * Revoke a single user-based OAuth 2.0 token.\n *\n * You must specify its source, access token (directly after login)\n * or refresh token (if you've called `.refreshOAuth2Token` before).\n */\n async revokeOAuth2Token(token, tokenType = 'access_token') {\n if (!this._requestMaker.clientId) {\n throw new Error('Twitter API instance is not initialized with client ID. ' +\n 'Please build an instance with: new TwitterApi({ clientId: \\'<yourClientId>\\' })');\n }\n return await this.post('https://api.x.com/2/oauth2/revoke', {\n client_id: this._requestMaker.clientId,\n client_secret: this._requestMaker.clientSecret,\n token,\n token_type_hint: tokenType,\n });\n }\n parseOAuth2AccessTokenResult(result) {\n const client = new this.constructor(result.access_token, this._requestMaker.clientSettings);\n const scope = result.scope.split(' ').filter(e => e);\n return {\n client,\n expiresIn: result.expires_in,\n accessToken: result.access_token,\n scope,\n refreshToken: result.refresh_token,\n };\n }\n}\nexports.default = TwitterApiReadOnly;\n",
72
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst client_v1_write_1 = __importDefault(require(\"../v1/client.v1.write\"));\nconst client_v2_write_1 = __importDefault(require(\"../v2/client.v2.write\"));\nconst readonly_1 = __importDefault(require(\"./readonly\"));\n/**\n * Twitter v1.1 and v2 API client.\n */\nclass TwitterApiReadWrite extends readonly_1.default {\n /* Direct access to subclients */\n get v1() {\n if (this._v1)\n return this._v1;\n return this._v1 = new client_v1_write_1.default(this);\n }\n get v2() {\n if (this._v2)\n return this._v2;\n return this._v2 = new client_v2_write_1.default(this);\n }\n /**\n * Get a client with read only rights.\n */\n get readOnly() {\n return this;\n }\n}\nexports.default = TwitterApiReadWrite;\n",
73
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst client_subclient_1 = __importDefault(require(\"../client.subclient\"));\nconst globals_1 = require(\"../globals\");\n/**\n * Base Twitter ads client with only read rights.\n */\nclass TwitterAdsReadOnly extends client_subclient_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_ADS_PREFIX;\n }\n}\nexports.default = TwitterAdsReadOnly;\n",
74
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst globals_1 = require(\"../globals\");\nconst client_ads_read_1 = __importDefault(require(\"./client.ads.read\"));\n/**\n * Base Twitter ads client with read/write rights.\n */\nclass TwitterAdsReadWrite extends client_ads_read_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_ADS_PREFIX;\n }\n /**\n * Get a client with only read rights.\n */\n get readOnly() {\n return this;\n }\n}\nexports.default = TwitterAdsReadWrite;\n",
75
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst client_subclient_1 = __importDefault(require(\"../client.subclient\"));\nconst globals_1 = require(\"../globals\");\n/**\n * Base Twitter ads sandbox client with only read rights.\n */\nclass TwitterAdsSandboxReadOnly extends client_subclient_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_ADS_SANDBOX_PREFIX;\n }\n}\nexports.default = TwitterAdsSandboxReadOnly;\n",
76
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst globals_1 = require(\"../globals\");\nconst client_ads_sandbox_read_1 = __importDefault(require(\"./client.ads-sandbox.read\"));\n/**\n * Base Twitter ads sandbox client with read/write rights.\n */\nclass TwitterAdsSandboxReadWrite extends client_ads_sandbox_read_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_ADS_SANDBOX_PREFIX;\n }\n /**\n * Get a client with only read rights.\n */\n get readOnly() {\n return this;\n }\n}\nexports.default = TwitterAdsSandboxReadWrite;\n",
77
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TwitterAdsSandbox = void 0;\nconst globals_1 = require(\"../globals\");\nconst client_ads_sandbox_write_1 = __importDefault(require(\"./client.ads-sandbox.write\"));\n/**\n * Twitter ads sandbox client with all rights (read/write)\n */\nclass TwitterAdsSandbox extends client_ads_sandbox_write_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_ADS_SANDBOX_PREFIX;\n }\n /**\n * Get a client with read/write rights.\n */\n get readWrite() {\n return this;\n }\n}\nexports.TwitterAdsSandbox = TwitterAdsSandbox;\nexports.default = TwitterAdsSandbox;\n",
78
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TwitterAds = void 0;\nconst globals_1 = require(\"../globals\");\nconst client_ads_write_1 = __importDefault(require(\"./client.ads.write\"));\nconst client_ads_sandbox_1 = __importDefault(require(\"../ads-sandbox/client.ads-sandbox\"));\n/**\n * Twitter ads client with all rights (read/write)\n */\nclass TwitterAds extends client_ads_write_1.default {\n constructor() {\n super(...arguments);\n this._prefix = globals_1.API_ADS_PREFIX;\n }\n /**\n * Get a client with read/write rights.\n */\n get readWrite() {\n return this;\n }\n /**\n * Get Twitter Ads Sandbox API client\n */\n get sandbox() {\n if (this._sandbox)\n return this._sandbox;\n return this._sandbox = new client_ads_sandbox_1.default(this);\n }\n}\nexports.TwitterAds = TwitterAds;\nexports.default = TwitterAds;\n",
79
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TwitterApiReadOnly = exports.TwitterApiReadWrite = exports.TwitterApi = void 0;\nconst client_v1_1 = __importDefault(require(\"../v1/client.v1\"));\nconst client_v2_1 = __importDefault(require(\"../v2/client.v2\"));\nconst readwrite_1 = __importDefault(require(\"./readwrite\"));\nconst client_ads_1 = __importDefault(require(\"../ads/client.ads\"));\n// \"Real\" exported client for usage of TwitterApi.\n/**\n * Twitter v1.1 and v2 API client.\n */\nclass TwitterApi extends readwrite_1.default {\n /* Direct access to subclients */\n get v1() {\n if (this._v1)\n return this._v1;\n return this._v1 = new client_v1_1.default(this);\n }\n get v2() {\n if (this._v2)\n return this._v2;\n return this._v2 = new client_v2_1.default(this);\n }\n /**\n * Get a client with read/write rights.\n */\n get readWrite() {\n return this;\n }\n /**\n * Get Twitter Ads API client\n */\n get ads() {\n if (this._ads)\n return this._ads;\n return this._ads = new client_ads_1.default(this);\n }\n /* Static helpers */\n static getErrors(error) {\n var _a;\n if (typeof error !== 'object')\n return [];\n if (!('data' in error))\n return [];\n return (_a = error.data.errors) !== null && _a !== void 0 ? _a : [];\n }\n /** Extract another image size than obtained in a `profile_image_url` or `profile_image_url_https` field of a user object. */\n static getProfileImageInSize(profileImageUrl, size) {\n const lastPart = profileImageUrl.split('/').pop();\n const sizes = ['normal', 'bigger', 'mini'];\n let originalUrl = profileImageUrl;\n for (const availableSize of sizes) {\n if (lastPart.includes(`_${availableSize}`)) {\n originalUrl = profileImageUrl.replace(`_${availableSize}`, '');\n break;\n }\n }\n if (size === 'original') {\n return originalUrl;\n }\n const extPos = originalUrl.lastIndexOf('.');\n if (extPos !== -1) {\n const ext = originalUrl.slice(extPos + 1);\n return originalUrl.slice(0, extPos) + '_' + size + '.' + ext;\n }\n else {\n return originalUrl + '_' + size;\n }\n }\n}\nexports.TwitterApi = TwitterApi;\nvar readwrite_2 = require(\"./readwrite\");\nObject.defineProperty(exports, \"TwitterApiReadWrite\", { enumerable: true, get: function () { return __importDefault(readwrite_2).default; } });\nvar readonly_1 = require(\"./readonly\");\nObject.defineProperty(exports, \"TwitterApiReadOnly\", { enumerable: true, get: function () { return __importDefault(readonly_1).default; } });\nexports.default = TwitterApi;\n",
80
- "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = void 0;\nvar client_1 = require(\"./client\");\nObject.defineProperty(exports, \"default\", { enumerable: true, get: function () { return __importDefault(client_1).default; } });\n__exportStar(require(\"./client\"), exports);\n__exportStar(require(\"./v1/client.v1\"), exports);\n__exportStar(require(\"./v2/client.v2\"), exports);\n__exportStar(require(\"./v2/includes.v2.helper\"), exports);\n__exportStar(require(\"./v2-labs/client.v2.labs\"), exports);\n__exportStar(require(\"./types\"), exports);\n__exportStar(require(\"./paginators\"), exports);\n__exportStar(require(\"./stream/TweetStream\"), exports);\n__exportStar(require(\"./settings\"), exports);\n",
81
- "import { type IAgentRuntime, logger, ModelType, type Plugin } from \"@elizaos/core\";\nimport { postAction } from \"./actions/post\";\nimport {\n handleTextEmbedding,\n handleTextLarge,\n handleTextSmall,\n isGrokConfigured,\n} from \"./models/grok\";\nimport { XService } from \"./services/x.service\";\nimport { getSetting } from \"./utils/settings\";\n\nexport { XService } from \"./services/x.service\";\n\nexport const XAIPlugin: Plugin = {\n name: \"xai\",\n description: \"xAI Grok models and X (formerly Twitter) API integration\",\n\n actions: [postAction],\n services: [XService],\n\n init: async (_config: Record<string, string>, runtime: IAgentRuntime) => {\n logger.log(\"Initializing xAI plugin...\");\n\n if (isGrokConfigured(runtime)) {\n logger.log(\"✓ Grok API configured\");\n }\n\n const authMode = getSetting(runtime, \"X_AUTH_MODE\") || \"env\";\n const hasApiKey = getSetting(runtime, \"X_API_KEY\");\n const hasBearer = getSetting(runtime, \"X_BEARER_TOKEN\");\n\n if (authMode === \"env\" && hasApiKey) {\n logger.log(\"✓ X API configured (OAuth 1.0a)\");\n } else if (authMode === \"bearer\" && hasBearer) {\n logger.log(\"✓ X API configured (Bearer token)\");\n } else if (authMode === \"oauth\") {\n logger.log(\"✓ X API configured (OAuth 2.0)\");\n }\n },\n\n models: {\n [ModelType.TEXT_SMALL]: handleTextSmall,\n [ModelType.TEXT_LARGE]: handleTextLarge,\n [ModelType.TEXT_EMBEDDING]: handleTextEmbedding,\n },\n\n tests: [\n {\n name: \"xai_plugin_tests\",\n tests: [\n {\n name: \"grok_api_connectivity\",\n fn: async (runtime: IAgentRuntime): Promise<void> => {\n const apiKey = runtime.getSetting(\"XAI_API_KEY\");\n if (!apiKey) return;\n\n const baseUrl = runtime.getSetting(\"XAI_BASE_URL\") || \"https://api.x.ai/v1\";\n const response = await fetch(`${baseUrl}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n\n if (!response.ok) {\n throw new Error(`Grok API error: ${response.status}`);\n }\n\n const data = (await response.json()) as { data: unknown[] };\n logger.info(`Grok connected: ${data.data.length} models`);\n },\n },\n {\n name: \"grok_text_generation\",\n fn: async (runtime: IAgentRuntime): Promise<void> => {\n if (!isGrokConfigured(runtime)) return;\n\n const text = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: \"Say hello in exactly 5 words.\",\n });\n\n if (typeof text !== \"string\" || !text) {\n throw new Error(\"Expected non-empty string\");\n }\n\n logger.info(`Generated: \"${text.slice(0, 50)}...\"`);\n },\n },\n ],\n },\n ],\n};\n\nexport default XAIPlugin;\n",
82
- "import {\n type Action,\n type ActionExample,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/spec-helpers\";\nimport type { XService } from \"../services/x.service\";\nimport { sendPost } from \"../utils\";\n\nconst spec = requireActionSpec(\"POST\");\n\nexport const postAction: Action = {\n name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['post'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:post)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime): Promise<boolean> => {\n const service = runtime.getService(\"x\");\n return !!service;\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n logger.info(\"Executing POST action\");\n\n const xService = runtime.getService(\"x\") as XService;\n if (!xService?.xClient?.client) {\n throw new Error(\"X service not available\");\n }\n\n const clientBase = xService.xClient.client;\n if (!clientBase.profile) {\n throw new Error(\"X client not initialized - no profile\");\n }\n const _client = clientBase.xClient;\n\n let text = message.content?.text?.trim();\n if (!text) {\n if (callback) {\n callback({\n text: \"I need something to post! Please provide the text.\",\n action: \"POST\",\n });\n }\n return { success: false, error: \"No text provided\" };\n }\n\n if (text.length > 280) {\n const sentences = text.match(/[^.!?]+[.!?]+/g) || [text];\n let truncated = \"\";\n for (const sentence of sentences) {\n if ((truncated + sentence).length <= 280) {\n truncated += sentence;\n } else {\n break;\n }\n }\n text = truncated.trim() || `${text.substring(0, 277)}...`;\n }\n\n let finalText = text;\n if (\n text.length < 50 ||\n text.toLowerCase().includes(\"post\") ||\n text.toLowerCase().includes(\"post\")\n ) {\n const prompt = `You are ${runtime.character.name}.\n${runtime.character.bio || \"\"}\n\nGenerate a post based on: ${text}\n\nStyle:\n- Be specific, opinionated, authentic\n- No generic content or platitudes\n- Share insights, hot takes, unique perspectives\n- Conversational and punchy\n- Under 280 characters\n- Skip hashtags unless essential\n\nTopics: ${runtime.character.topics?.join(\", \") || \"technology, AI\"}\n\nPost:`;\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n maxTokens: 100,\n temperature: 0.9,\n });\n\n finalText = String(response).trim();\n }\n\n const result = await sendPost(clientBase, finalText);\n\n if (result) {\n const postId = result.id || result.data?.id || result.data?.data?.id || Date.now().toString();\n const postUrl = `https://x.com/${clientBase.profile.username}/status/${postId}`;\n\n logger.info(`Posted: ${postId}`);\n\n await runtime.createMemory(\n {\n entityId: runtime.agentId,\n content: {\n text: finalText,\n url: postUrl,\n source: \"x\",\n action: \"POST\",\n },\n roomId: message.roomId,\n },\n \"messages\"\n );\n\n if (callback) {\n await callback({\n text: `Posted: \"${finalText}\"\\n\\n${postUrl}`,\n metadata: { postId, postUrl },\n });\n }\n return { success: true, text: `Posted: ${postUrl}` };\n } else {\n throw new Error(\"Failed to post - no response data\");\n }\n },\n\n examples: (spec.examples ?? []) as ActionExample[][],\n};\n",
83
- "/**\n * Auto-generated canonical action/provider/evaluator docs for plugin-xai.\n * DO NOT EDIT - Generated from prompts/specs/**.\n */\n\nexport type ActionDoc = {\n name: string;\n description: string;\n similes?: readonly string[];\n parameters?: readonly unknown[];\n examples?: readonly (readonly unknown[])[];\n};\n\nexport type ProviderDoc = {\n name: string;\n description: string;\n position?: number;\n dynamic?: boolean;\n};\n\nexport type EvaluatorDoc = {\n name: string;\n description: string;\n similes?: readonly string[];\n alwaysRun?: boolean;\n examples?: readonly unknown[];\n};\n\nexport const coreActionsSpec = {\n version: \"1.0.0\",\n actions: [\n {\n name: \"POST\",\n description: \"Post content on X (formerly Twitter)\",\n similes: [\"POST_TO_X\", \"POST\", \"SEND_POST\", \"SHARE_ON_X\"],\n parameters: [],\n },\n ],\n} as const;\nexport const allActionsSpec = {\n version: \"1.0.0\",\n actions: [\n {\n name: \"POST\",\n description: \"Post content on X (formerly Twitter)\",\n similes: [\"POST_TO_X\", \"POST\", \"SEND_POST\", \"SHARE_ON_X\"],\n parameters: [],\n },\n ],\n} as const;\nexport const coreProvidersSpec = {\n version: \"1.0.0\",\n providers: [],\n} as const;\nexport const allProvidersSpec = {\n version: \"1.0.0\",\n providers: [],\n} as const;\nexport const coreEvaluatorsSpec = {\n version: \"1.0.0\",\n evaluators: [],\n} as const;\nexport const allEvaluatorsSpec = {\n version: \"1.0.0\",\n evaluators: [],\n} as const;\n\nexport const coreActionDocs: readonly ActionDoc[] = coreActionsSpec.actions;\nexport const allActionDocs: readonly ActionDoc[] = allActionsSpec.actions;\nexport const coreProviderDocs: readonly ProviderDoc[] = coreProvidersSpec.providers;\nexport const allProviderDocs: readonly ProviderDoc[] = allProvidersSpec.providers;\nexport const coreEvaluatorDocs: readonly EvaluatorDoc[] = coreEvaluatorsSpec.evaluators;\nexport const allEvaluatorDocs: readonly EvaluatorDoc[] = allEvaluatorsSpec.evaluators;\n",
84
- "/**\n * Helper functions to lookup action/provider/evaluator specs by name.\n * These allow language-specific implementations to import their text content\n * (description, similes, examples) from the centralized specs.\n *\n * DO NOT EDIT the spec data - update prompts/actions.json, prompts/providers.json, prompts/evaluators.json and regenerate.\n */\n\nimport {\n type ActionDoc,\n allActionDocs,\n allEvaluatorDocs,\n allProviderDocs,\n coreActionDocs,\n coreEvaluatorDocs,\n coreProviderDocs,\n type EvaluatorDoc,\n type ProviderDoc,\n} from \"./specs\";\n\n// Build lookup maps for O(1) access\nconst coreActionMap = new Map<string, ActionDoc>(coreActionDocs.map((doc) => [doc.name, doc]));\nconst allActionMap = new Map<string, ActionDoc>(allActionDocs.map((doc) => [doc.name, doc]));\nconst coreProviderMap = new Map<string, ProviderDoc>(\n coreProviderDocs.map((doc) => [doc.name, doc])\n);\nconst allProviderMap = new Map<string, ProviderDoc>(allProviderDocs.map((doc) => [doc.name, doc]));\nconst coreEvaluatorMap = new Map<string, EvaluatorDoc>(\n coreEvaluatorDocs.map((doc) => [doc.name, doc])\n);\nconst allEvaluatorMap = new Map<string, EvaluatorDoc>(\n allEvaluatorDocs.map((doc) => [doc.name, doc])\n);\n\n/**\n * Get an action spec by name from the core specs.\n * @param name - The action name\n * @returns The action spec or undefined if not found\n */\nexport function getActionSpec(name: string): ActionDoc | undefined {\n return coreActionMap.get(name) ?? allActionMap.get(name);\n}\n\n/**\n * Get an action spec by name, throwing if not found.\n * @param name - The action name\n * @returns The action spec\n * @throws Error if the action is not found\n */\nexport function requireActionSpec(name: string): ActionDoc {\n const spec = getActionSpec(name);\n if (!spec) {\n throw new Error(`Action spec not found: ${name}`);\n }\n return spec;\n}\n\n/**\n * Get a provider spec by name from the core specs.\n * @param name - The provider name\n * @returns The provider spec or undefined if not found\n */\nexport function getProviderSpec(name: string): ProviderDoc | undefined {\n return coreProviderMap.get(name) ?? allProviderMap.get(name);\n}\n\n/**\n * Get a provider spec by name, throwing if not found.\n * @param name - The provider name\n * @returns The provider spec\n * @throws Error if the provider is not found\n */\nexport function requireProviderSpec(name: string): ProviderDoc {\n const spec = getProviderSpec(name);\n if (!spec) {\n throw new Error(`Provider spec not found: ${name}`);\n }\n return spec;\n}\n\n/**\n * Get an evaluator spec by name from the core specs.\n * @param name - The evaluator name\n * @returns The evaluator spec or undefined if not found\n */\nexport function getEvaluatorSpec(name: string): EvaluatorDoc | undefined {\n return coreEvaluatorMap.get(name) ?? allEvaluatorMap.get(name);\n}\n\n/**\n * Get an evaluator spec by name, throwing if not found.\n * @param name - The evaluator name\n * @returns The evaluator spec\n * @throws Error if the evaluator is not found\n */\nexport function requireEvaluatorSpec(name: string): EvaluatorDoc {\n const spec = getEvaluatorSpec(name);\n if (!spec) {\n throw new Error(`Evaluator spec not found: ${name}`);\n }\n return spec;\n}\n\n// Re-export types for convenience\nexport type { ActionDoc, ProviderDoc, EvaluatorDoc };\n",
85
- "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Media } from \"@elizaos/core\";\nimport {\n type Content,\n createUniqueUuid,\n logger,\n type Memory,\n truncateToCompleteSentence,\n type UUID,\n} from \"@elizaos/core\";\nimport type { ClientBase } from \"./base\";\nimport type { Post } from \"./client\";\nimport { TWEET_MAX_LENGTH } from \"./constants\";\nimport type { ActionResponse, MediaData, PostResponse } from \"./types\";\n\nexport const wait = (minTime = 1000, maxTime = 3000) => {\n const waitTime = Math.floor(Math.random() * (maxTime - minTime + 1)) + minTime;\n return new Promise((resolve) => setTimeout(resolve, waitTime));\n};\n\nexport const isValidPost = (post: Post): boolean => {\n const hashtagCount = (post.text?.match(/#/g) || []).length;\n const atCount = (post.text?.match(/@/g) || []).length;\n const dollarSignCount = (post.text?.match(/\\$/g) || []).length;\n const totalCount = hashtagCount + atCount + dollarSignCount;\n\n return hashtagCount <= 1 && atCount <= 2 && dollarSignCount <= 1 && totalCount <= 3;\n};\n\nexport async function fetchMediaData(attachments: Media[]): Promise<MediaData[]> {\n return Promise.all(\n attachments.map(async (attachment: Media) => {\n if (/^(http|https):\\/\\//.test(attachment.url)) {\n const response = await fetch(attachment.url);\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${attachment.url}`);\n }\n const mediaBuffer = Buffer.from(await response.arrayBuffer());\n const mediaType = attachment.contentType || \"image/png\";\n return { data: mediaBuffer, type: mediaType };\n }\n if (fs.existsSync(attachment.url)) {\n const mediaBuffer = await fs.promises.readFile(path.resolve(attachment.url));\n const mediaType = attachment.contentType || \"image/png\";\n return { data: mediaBuffer, type: mediaType };\n }\n throw new Error(`File not found: ${attachment.url}. Make sure the path is correct.`);\n })\n );\n}\n\nasync function _handleNotePost(\n client: ClientBase,\n content: string,\n postId?: string,\n mediaData?: MediaData[]\n) {\n const convertedMediaData = mediaData?.map((m) => ({\n data: Buffer.isBuffer(m.data) ? m.data : Buffer.from(m.data),\n mediaType: m.type,\n }));\n const result = await client.xClient.sendPost(content, postId, convertedMediaData);\n\n if (!result || !result.ok) {\n const truncateContent = truncateToCompleteSentence(content, TWEET_MAX_LENGTH);\n return await sendStandardPost(client, truncateContent, postId);\n }\n\n return result;\n}\n\nexport async function sendStandardPost(\n client: ClientBase,\n content: string,\n postId?: string,\n mediaData?: MediaData[]\n) {\n const convertedMediaData = mediaData?.map((m) => ({\n data: Buffer.isBuffer(m.data) ? m.data : Buffer.from(m.data),\n mediaType: m.type,\n }));\n return await client.xClient.sendPost(content, postId, convertedMediaData);\n}\n\nexport async function sendPost(\n client: ClientBase,\n text: string,\n mediaData: MediaData[] = [],\n postToReplyTo?: string\n): Promise<PostResponse | null> {\n const isNotePost = text.length > TWEET_MAX_LENGTH;\n const postText = isNotePost ? truncateToCompleteSentence(text, TWEET_MAX_LENGTH) : text;\n\n let result: { data?: { data?: { id?: string } }; id?: string } | undefined;\n\n try {\n const convertedMediaData = mediaData.map((m) => ({\n data: Buffer.isBuffer(m.data) ? m.data : Buffer.from(m.data),\n mediaType: m.type,\n }));\n result = await client.xClient.sendPost(postText, postToReplyTo, convertedMediaData);\n logger.log(\"Successfully posted Post\");\n } catch (error: unknown) {\n logger.error(\"Error posting Post:\", error instanceof Error ? error.message : String(error));\n throw error;\n }\n\n try {\n const postData = result?.data || result;\n\n const rawResult = (postData?.data || postData) as\n | { id?: string; text?: string; data?: { id?: string; data?: { id?: string } } }\n | undefined;\n\n const postId = rawResult && (\"id\" in rawResult ? rawResult.id : rawResult.data?.id);\n if (postId) {\n if (client.lastCheckedPostId && client.lastCheckedPostId < BigInt(postId)) {\n client.lastCheckedPostId = BigInt(postId);\n } else if (!client.lastCheckedPostId) {\n client.lastCheckedPostId = BigInt(postId);\n }\n await client.cacheLatestCheckedPostId();\n\n const postText = rawResult && (\"text\" in rawResult ? rawResult.text : undefined);\n if (postId && postText) {\n await client.cachePost({ id: postId, text: postText, ...rawResult } as Post);\n }\n\n logger.log(\"Successfully posted a post\", postId);\n\n const postResult: PostResponse = {\n id: rawResult.id,\n data: rawResult.data,\n };\n return postResult;\n }\n } catch (error) {\n logger.error(\n \"Error parsing post response:\",\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n }\n\n logger.error(\"No valid response from X API\");\n throw new Error(\"Failed to send post - no valid response\");\n}\n\n/**\n * Sends a post on X using the given client.\n *\n * @param {ClientBase} client The client used to send the post.\n * @param {Content} content The content of the post.\n * @param {UUID} roomId The ID of the room where the post will be sent.\n * @param {string} xUsername The X username of the sender.\n * @param {string} inReplyTo The ID of the post to which the new post will reply.\n * @returns {Promise<Memory[]>} An array of memories representing the sent posts.\n */\nexport async function sendChunkedPost(\n client: ClientBase,\n content: Content,\n roomId: UUID,\n xUsername: string,\n inReplyTo: string\n): Promise<Memory[]> {\n const messages: Memory[] = [];\n if (!content.text) {\n logger.warn(\"Cannot split post content: text is undefined\");\n return [];\n }\n const chunks = splitPostContent(content.text, TWEET_MAX_LENGTH);\n\n let previousPostId = inReplyTo;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const _isLastChunk = i === chunks.length - 1;\n\n const postContent = `${chunk}`;\n\n logger.debug(`Sending post ${i + 1}/${chunks.length}: ${postContent}`);\n\n try {\n let mediaData: MediaData[] = [];\n if (content.attachments && content.attachments.length > 0) {\n mediaData = await fetchMediaData(content.attachments);\n }\n\n const result = await sendPost(client, postContent, mediaData, previousPostId);\n\n if (!result) {\n throw new Error(\"Failed to send post - no result returned\");\n }\n\n const postId = result.id || result.data?.id || result.data?.data?.id;\n\n if (postId) {\n const permanentUrl = `https://x.com/${xUsername}/status/${postId}`;\n\n const memory: Memory = {\n id: createUniqueUuid(client.runtime, postId),\n entityId: client.runtime.agentId,\n content: {\n text: chunk,\n url: permanentUrl,\n source: \"x\",\n },\n agentId: client.runtime.agentId,\n roomId,\n createdAt: Date.now(),\n };\n\n messages.push(memory);\n previousPostId = postId;\n }\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(`Error sending chunk ${i + 1}:`, err.message);\n throw err;\n }\n }\n\n return messages;\n}\n\nfunction splitPostContent(content: string, maxLength: number): string[] {\n const paragraphs = content.split(\"\\n\\n\").map((p) => p.trim());\n const posts: string[] = [];\n let currentPost = \"\";\n\n for (const paragraph of paragraphs) {\n if (!paragraph) continue;\n\n if (`${currentPost}\\n\\n${paragraph}`.trim().length <= maxLength) {\n if (currentPost) {\n currentPost += `\\n\\n${paragraph}`;\n } else {\n currentPost = paragraph;\n }\n } else {\n if (currentPost) {\n posts.push(currentPost.trim());\n }\n if (paragraph.length <= maxLength) {\n currentPost = paragraph;\n } else {\n // Split long paragraph into smaller chunks\n const chunks = splitParagraph(paragraph, maxLength);\n posts.push(...chunks.slice(0, -1));\n currentPost = chunks[chunks.length - 1];\n }\n }\n }\n\n if (currentPost) {\n posts.push(currentPost.trim());\n }\n\n return posts;\n}\n\nfunction extractUrls(paragraph: string): {\n textWithPlaceholders: string;\n placeholderMap: Map<string, string>;\n} {\n const urlRegex = /https?:\\/\\/[^\\s]+/g;\n const placeholderMap = new Map<string, string>();\n\n let urlIndex = 0;\n const textWithPlaceholders = paragraph.replace(urlRegex, (match) => {\n const placeholder = `<<URL_CONSIDERER_23_${urlIndex}>>`;\n placeholderMap.set(placeholder, match);\n urlIndex++;\n return placeholder;\n });\n\n return { textWithPlaceholders, placeholderMap };\n}\n\n/**\n * Splits a given text into chunks based on the specified maximum length while preserving sentence boundaries.\n *\n * @param {string} text - The text to be split into chunks\n * @param {number} maxLength - The maximum length each chunk should not exceed\n *\n * @returns {string[]} An array of chunks where each chunk is within the specified maximum length\n */\nfunction splitSentencesAndWords(text: string, maxLength: number): string[] {\n // Split by periods, question marks and exclamation marks\n // Note that URLs in text have been replaced with `<<URL_xxx>>` and won't be split by dots\n const sentences = text.match(/[^.!?]+[.!?]+|[^.!?]+$/g) || [text];\n const chunks: string[] = [];\n let currentChunk = \"\";\n\n for (const sentence of sentences) {\n if (`${currentChunk} ${sentence}`.trim().length <= maxLength) {\n if (currentChunk) {\n currentChunk += ` ${sentence}`;\n } else {\n currentChunk = sentence;\n }\n } else {\n if (currentChunk) {\n chunks.push(currentChunk.trim());\n }\n\n if (sentence.length <= maxLength) {\n currentChunk = sentence;\n } else {\n const words = sentence.split(\" \");\n currentChunk = \"\";\n for (const word of words) {\n if (`${currentChunk} ${word}`.trim().length <= maxLength) {\n if (currentChunk) {\n currentChunk += ` ${word}`;\n } else {\n currentChunk = word;\n }\n } else {\n if (currentChunk) {\n chunks.push(currentChunk.trim());\n }\n currentChunk = word;\n }\n }\n }\n }\n }\n\n if (currentChunk) {\n chunks.push(currentChunk.trim());\n }\n\n return chunks;\n}\n\nfunction _deduplicateMentions(paragraph: string) {\n const mentionRegex = /^@(\\w+)(?:\\s+@(\\w+))*(\\s+|$)/;\n const matches = paragraph.match(mentionRegex);\n\n if (!matches) {\n return paragraph;\n }\n\n let mentions = matches.slice(0, 1)[0].trim().split(\" \");\n mentions = Array.from(new Set(mentions));\n\n const uniqueMentionsString = mentions.join(\" \");\n const endOfMentions = paragraph.indexOf(matches[0]) + matches[0].length;\n\n return `${uniqueMentionsString} ${paragraph.slice(endOfMentions)}`;\n}\n\nfunction restoreUrls(chunks: string[], placeholderMap: Map<string, string>): string[] {\n return chunks.map((chunk) => {\n return chunk.replace(/<<URL_CONSIDERER_23_(\\d+)>>/g, (match) => {\n const original = placeholderMap.get(match);\n return original || match;\n });\n });\n}\n\nfunction splitParagraph(paragraph: string, maxLength: number): string[] {\n const { textWithPlaceholders, placeholderMap } = extractUrls(paragraph);\n const splittedChunks = splitSentencesAndWords(textWithPlaceholders, maxLength);\n const restoredChunks = restoreUrls(splittedChunks, placeholderMap);\n\n return restoredChunks;\n}\n\n/**\n * Parses the action response from the given text.\n *\n * @param {string} text - The text to parse actions from.\n * @returns {{ actions: ActionResponse }} The parsed actions with boolean values indicating if each action is present in the text.\n */\nexport const parseActionResponseFromText = (text: string): { actions: ActionResponse } => {\n const actions: ActionResponse = {\n text: \"\",\n actions: [],\n like: false,\n repost: false,\n quote: false,\n reply: false,\n };\n\n const likePattern = /\\[LIKE\\]/i;\n const repostPattern = /\\[REPOST\\]|\\[RETWEET\\]/i;\n const quotePattern = /\\[QUOTE\\]/i;\n const replyPattern = /\\[REPLY\\]/i;\n\n actions.like = likePattern.test(text);\n actions.repost = repostPattern.test(text);\n actions.quote = quotePattern.test(text);\n actions.reply = replyPattern.test(text);\n\n const lines = text.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"[LIKE]\") actions.like = true;\n if (trimmed === \"[REPOST]\" || trimmed === \"[RETWEET]\") actions.repost = true;\n if (trimmed === \"[QUOTE]\") actions.quote = true;\n if (trimmed === \"[REPLY]\") actions.reply = true;\n }\n\n return { actions };\n};\n\nexport * from \"./utils/error-handler\";\n",
86
- "export const X_SERVICE_NAME = \"x\";\nexport const TWEET_CHAR_LIMIT = 280;\nexport const TWEET_MAX_LENGTH = 280;\nexport const THREAD_TWEET_MAX_LENGTH = 4000;\n",
87
- "import {\n type GenerateTextParams,\n type IAgentRuntime,\n logger,\n type TextEmbeddingParams,\n type TextStreamResult,\n} from \"@elizaos/core\";\n\nconst XAI_API_BASE = \"https://api.x.ai/v1\";\n\nconst DEFAULT_MODELS = {\n small: \"grok-3-mini\",\n large: \"grok-3\",\n embedding: \"grok-embedding\",\n} as const;\n\ninterface GrokConfig {\n apiKey: string;\n baseUrl: string;\n smallModel: string;\n largeModel: string;\n embeddingModel: string;\n}\n\nfunction getConfig(runtime: IAgentRuntime): GrokConfig {\n const apiKey = runtime.getSetting(\"XAI_API_KEY\");\n if (!apiKey || typeof apiKey !== \"string\") {\n throw new Error(\"XAI_API_KEY is required\");\n }\n\n const baseUrl = runtime.getSetting(\"XAI_BASE_URL\");\n const smallModel = runtime.getSetting(\"XAI_SMALL_MODEL\");\n const largeModel = runtime.getSetting(\"XAI_MODEL\") || runtime.getSetting(\"XAI_LARGE_MODEL\");\n const embeddingModel = runtime.getSetting(\"XAI_EMBEDDING_MODEL\");\n\n return {\n apiKey,\n baseUrl: typeof baseUrl === \"string\" ? baseUrl : XAI_API_BASE,\n smallModel: typeof smallModel === \"string\" ? smallModel : DEFAULT_MODELS.small,\n largeModel: typeof largeModel === \"string\" ? largeModel : DEFAULT_MODELS.large,\n embeddingModel: typeof embeddingModel === \"string\" ? embeddingModel : DEFAULT_MODELS.embedding,\n };\n}\n\nfunction getAuthHeader(config: GrokConfig): Record<string, string> {\n return {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\ninterface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\ninterface ChatCompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string;\n };\n finish_reason: string;\n }>;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\ninterface EmbeddingResponse {\n object: string;\n data: Array<{\n object: string;\n embedding: number[];\n index: number;\n }>;\n model: string;\n usage: {\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n\nasync function generateText(\n config: GrokConfig,\n model: string,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n const messages: ChatMessage[] = [];\n messages.push({ role: \"user\", content: params.prompt });\n\n const body: Record<string, unknown> = {\n model,\n messages,\n };\n\n if (params.temperature !== undefined) {\n body.temperature = params.temperature;\n }\n if (params.maxTokens !== undefined) {\n body.max_tokens = params.maxTokens;\n }\n if (params.stopSequences) {\n body.stop = params.stopSequences;\n }\n\n if (params.stream && params.onStreamChunk) {\n body.stream = true;\n\n const response = await fetch(`${config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let fullText = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const data = line.slice(6);\n if (data === \"[DONE]\") continue;\n\n const parsed = JSON.parse(data);\n const content = parsed.choices[0].delta?.content;\n if (content) {\n fullText += content;\n params.onStreamChunk(content);\n }\n }\n }\n\n return fullText;\n }\n\n const response = await fetch(`${config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as ChatCompletionResponse;\n\n if (!data.choices?.[0]?.message?.content) {\n throw new Error(\"No content in Grok response\");\n }\n\n return data.choices[0].message.content;\n}\n\nasync function createEmbedding(config: GrokConfig, text: string): Promise<number[]> {\n const response = await fetch(`${config.baseUrl}/embeddings`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify({\n model: config.embeddingModel,\n input: text,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok Embedding API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as EmbeddingResponse;\n\n if (!data.data?.[0]?.embedding) {\n throw new Error(\"No embedding in Grok response\");\n }\n\n return data.data[0].embedding;\n}\n\nexport async function handleTextSmall(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n const config = getConfig(runtime);\n logger.debug(`[Grok] Generating text with model: ${config.smallModel}`);\n return generateText(config, config.smallModel, params);\n}\n\nexport async function handleTextLarge(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n const config = getConfig(runtime);\n logger.debug(`[Grok] Generating text with model: ${config.largeModel}`);\n return generateText(config, config.largeModel, params);\n}\n\nexport async function handleTextEmbedding(\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null\n): Promise<number[]> {\n if (params === null) {\n throw new Error(\"Null params provided for embedding\");\n }\n const config = getConfig(runtime);\n const text = typeof params === \"string\" ? params : (params as TextEmbeddingParams).text;\n if (!text) {\n throw new Error(\"Empty text provided for embedding\");\n }\n logger.debug(`[Grok] Creating embedding with model: ${config.embeddingModel}`);\n return createEmbedding(config, text);\n}\n\nexport async function listModels(runtime: IAgentRuntime): Promise<Record<string, unknown>[]> {\n const config = getConfig(runtime);\n\n const response = await fetch(`${config.baseUrl}/models`, {\n headers: getAuthHeader(config),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as { data: Record<string, unknown>[] };\n return data.data;\n}\n\nexport function isGrokConfigured(runtime: IAgentRuntime): boolean {\n return !!runtime.getSetting(\"XAI_API_KEY\");\n}\n",
88
- "import { type IAgentRuntime, logger, parseBooleanFromText, Service } from \"@elizaos/core\";\nimport { ClientBase } from \"../base\";\nimport { XDiscoveryClient } from \"../discovery\";\nimport { validateXConfig } from \"../environment\";\nimport { XInteractionClient } from \"../interactions\";\nimport { XPostClient } from \"../post\";\nimport { XTimelineClient } from \"../timeline\";\nimport type { IXClient } from \"../types\";\nimport { getSetting } from \"../utils/settings\";\n\nexport class XClientInstance implements IXClient {\n client: ClientBase;\n post?: XPostClient;\n interaction?: XInteractionClient;\n timeline?: XTimelineClient;\n discovery?: XDiscoveryClient;\n\n constructor(runtime: IAgentRuntime, state: Record<string, unknown>) {\n this.client = new ClientBase(runtime, state);\n\n const postEnabled = parseBooleanFromText(getSetting(runtime, \"X_ENABLE_POST\"));\n if (postEnabled) {\n logger.info(\"X posting ENABLED\");\n this.post = new XPostClient(this.client, runtime, state);\n }\n\n const repliesEnabled = getSetting(runtime, \"X_ENABLE_REPLIES\") !== \"false\";\n if (repliesEnabled) {\n logger.info(\"X replies ENABLED\");\n this.interaction = new XInteractionClient(this.client, runtime, state);\n }\n\n const actionsEnabled = getSetting(runtime, \"X_ENABLE_ACTIONS\") === \"true\";\n if (actionsEnabled) {\n logger.info(\"X timeline actions ENABLED\");\n this.timeline = new XTimelineClient(this.client, runtime, state);\n }\n\n const discoveryEnabled =\n getSetting(runtime, \"X_ENABLE_DISCOVERY\") === \"true\" ||\n (actionsEnabled && getSetting(runtime, \"X_ENABLE_DISCOVERY\") !== \"false\");\n if (discoveryEnabled) {\n logger.info(\"X discovery ENABLED\");\n this.discovery = new XDiscoveryClient(this.client, runtime, state);\n }\n }\n}\n\nexport class XService extends Service {\n static serviceType = \"x\";\n capabilityDescription = \"Send and receive posts on X (formerly Twitter)\";\n\n public xClient?: XClientInstance;\n\n static async start(runtime: IAgentRuntime): Promise<XService> {\n const service = new XService();\n service.runtime = runtime;\n\n await validateXConfig(runtime);\n logger.log(\"✅ X configuration validated\");\n\n service.xClient = new XClientInstance(runtime, {});\n await service.xClient.client.init();\n\n if (service.xClient.post) {\n logger.log(\"📮 Starting X post client...\");\n await service.xClient.post.start();\n }\n\n if (service.xClient.interaction) {\n logger.log(\"💬 Starting X interaction client...\");\n await service.xClient.interaction.start();\n }\n\n if (service.xClient.timeline) {\n logger.log(\"📊 Starting X timeline client...\");\n await service.xClient.timeline.start();\n }\n\n if (service.xClient.discovery) {\n logger.log(\"🔍 Starting X discovery client...\");\n await service.xClient.discovery.start();\n }\n\n logger.log(\"✅ X service started\");\n return service;\n }\n\n async stop(): Promise<void> {\n if (this.xClient?.post) await this.xClient.post.stop();\n if (this.xClient?.interaction) await this.xClient.interaction.stop();\n if (this.xClient?.timeline) await this.xClient.timeline.stop();\n if (this.xClient?.discovery) await this.xClient.discovery.stop();\n logger.log(\"X service stopped\");\n }\n}\n",
89
- "import {\n ChannelType,\n type Content,\n createUniqueUuid,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n type UUID,\n} from \"@elizaos/core\";\n\n// WorldOwnership type for world metadata\ntype WorldOwnership = { ownerId: string };\n\nimport { createXAuthProvider, getXAuthMode } from \"./client/auth-providers/factory\";\nimport { Client, type Post, type QueryPostsResponse, SearchMode } from \"./client/index\";\nimport type { XInteractionPayload } from \"./types\";\nimport { createMemorySafe } from \"./utils/memory\";\nimport { getSetting } from \"./utils/settings\";\nimport { getEpochMs } from \"./utils/time\";\n\nexport function extractAnswer(text: string): string {\n const startIndex = text.indexOf(\"Answer: \") + 8;\n const endIndex = text.indexOf(\"<|endoftext|>\", 11);\n return text.slice(startIndex, endIndex);\n}\n\ntype XProfile = {\n id: string;\n username: string;\n screenName: string;\n bio: string;\n nicknames: string[];\n};\n\nclass RequestQueue {\n private queue: (() => Promise<unknown>)[] = [];\n private processing = false;\n private maxRetries = 3;\n private retryAttempts = new Map<() => Promise<unknown>, number>();\n\n async add<T>(request: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n this.queue.push(async () => {\n try {\n const result = await request();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n this.processQueue();\n });\n }\n\n private async processQueue(): Promise<void> {\n if (this.processing || this.queue.length === 0) {\n return;\n }\n this.processing = true;\n\n while (this.queue.length > 0) {\n const request = this.queue.shift();\n if (!request) continue;\n try {\n await request();\n this.retryAttempts.delete(request);\n } catch (error: unknown) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"Error processing request:\", errorMsg);\n\n const retryCount = (this.retryAttempts.get(request) || 0) + 1;\n\n if (retryCount < this.maxRetries) {\n this.retryAttempts.set(request, retryCount);\n this.queue.unshift(request);\n await this.exponentialBackoff(retryCount);\n break;\n } else {\n logger.error(`Max retries (${this.maxRetries}) exceeded for request, skipping`);\n this.retryAttempts.delete(request);\n }\n }\n await this.randomDelay();\n }\n\n this.processing = false;\n\n if (this.queue.length > 0) {\n this.processQueue();\n }\n }\n\n private async exponentialBackoff(retryCount: number): Promise<void> {\n const delay = 2 ** retryCount * 1000;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n private async randomDelay(): Promise<void> {\n const delay = Math.floor(Math.random() * 2000) + 1500;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n}\n\nexport class ClientBase {\n static _xClients: { [accountIdentifier: string]: Client } = {};\n xClient: Client;\n runtime: IAgentRuntime;\n lastCheckedPostId: bigint | null = null;\n temperature = 0.5;\n\n requestQueue: RequestQueue = new RequestQueue();\n\n profile: XProfile | null = null;\n\n async cachePost(post: Post): Promise<void> {\n if (!post) {\n logger.warn(\"Post is undefined, skipping cache\");\n return;\n }\n\n this.runtime.setCache<Post>(`x/posts/${post.id}`, post);\n }\n\n async getCachedPost(postId: string): Promise<Post | undefined> {\n const cached = await this.runtime.getCache<Post>(`x/posts/${postId}`);\n\n if (!cached) {\n return undefined;\n }\n\n return cached;\n }\n\n async getPost(postId: string): Promise<Post> {\n const cachedPost = await this.getCachedPost(postId);\n\n if (cachedPost) {\n return cachedPost;\n }\n\n const post = await this.requestQueue.add(() => this.xClient.getPost(postId));\n\n if (!post) {\n throw new Error(`Post ${postId} not found`);\n }\n\n await this.cachePost(post);\n return post as Post;\n }\n\n callback: ((self: ClientBase) => void) | null = null;\n\n onReady() {\n throw new Error(\"Not implemented in base class, please call from subclass\");\n }\n\n state: Record<string, unknown>;\n\n constructor(runtime: IAgentRuntime, state: Record<string, unknown>) {\n this.runtime = runtime;\n this.state = state;\n\n const mode = getXAuthMode(runtime, state);\n const reuseKey =\n mode === \"env\"\n ? typeof state?.X_API_KEY === \"string\"\n ? state.X_API_KEY\n : getSetting(runtime, \"X_API_KEY\")\n : mode === \"oauth\"\n ? typeof state?.X_CLIENT_ID === \"string\"\n ? state.X_CLIENT_ID\n : getSetting(runtime, \"X_CLIENT_ID\")\n : typeof state?.X_BROKER_URL === \"string\"\n ? state.X_BROKER_URL\n : getSetting(runtime, \"X_BROKER_URL\");\n\n if (typeof reuseKey === \"string\" && reuseKey && ClientBase._xClients[reuseKey]) {\n this.xClient = ClientBase._xClients[reuseKey];\n } else {\n this.xClient = new Client();\n if (typeof reuseKey === \"string\" && reuseKey) {\n ClientBase._xClients[reuseKey] = this.xClient;\n }\n }\n }\n\n async init() {\n const provider = createXAuthProvider(this.runtime, this.state);\n\n const maxRetries = process.env.MAX_RETRIES ? Number.parseInt(process.env.MAX_RETRIES, 10) : 3;\n let retryCount = 0;\n let lastError: Error | null = null;\n\n while (retryCount < maxRetries) {\n try {\n logger.log(\"Initializing X API v2 client\");\n await this.xClient.authenticate(provider);\n\n if (await this.xClient.isLoggedIn()) {\n logger.info(\"Successfully authenticated with X API v2\");\n break;\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n logger.error(`Authentication attempt ${retryCount + 1} failed: ${lastError.message}`);\n retryCount++;\n\n if (retryCount < maxRetries) {\n const delay = 2 ** retryCount * 1000;\n logger.info(`Retrying in ${delay / 1000} seconds...`);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n if (retryCount >= maxRetries) {\n throw new Error(\n `X authentication failed after ${maxRetries} attempts. Last error: ${lastError?.message}`\n );\n }\n\n const profile = await this.xClient.me();\n if (profile) {\n logger.log(\"X user ID:\", profile.userId);\n logger.log(\"X loaded:\", JSON.stringify(profile, null, 10));\n\n const agentId = this.runtime.agentId;\n\n const entity = await this.runtime.getEntityById(agentId);\n const entityMetadata = entity?.metadata;\n const xMetadata = entityMetadata?.x as { userName?: string; name?: string } | undefined;\n if (xMetadata?.userName !== profile.username) {\n logger.log(\"Updating Agents known X handle\", profile.username, \"was\", entityMetadata?.x);\n const names = [profile.name, profile.username].filter((n): n is string => !!n);\n if (!entity) {\n throw new Error(\"Entity not found\");\n }\n await this.runtime.updateEntity({\n id: agentId,\n names: [...new Set([...(entity.names || []), ...names])],\n metadata: {\n ...(entityMetadata || {}),\n x: {\n ...(xMetadata || {}),\n name: profile.name,\n userName: profile.username,\n },\n },\n agentId,\n });\n }\n\n // Store profile info for use in responses\n if (!profile.userId || !profile.username || !profile.name) {\n throw new Error(\"Profile missing required fields\");\n }\n this.profile = {\n id: profile.userId,\n username: profile.username,\n screenName: profile.name,\n bio: profile.biography || \"\",\n nicknames: [],\n };\n } else {\n throw new Error(\"Failed to load profile\");\n }\n\n await this.loadLatestCheckedPostId();\n await this.populateTimeline();\n }\n\n async fetchOwnPosts(count: number): Promise<Post[]> {\n logger.debug(\"fetching own posts\");\n if (!this.profile?.id) {\n throw new Error(\"Profile not initialized\");\n }\n const homeTimeline = await this.xClient.getUserPosts(this.profile.id, count);\n return homeTimeline.posts;\n }\n\n async fetchHomeTimeline(count: number, following?: boolean): Promise<Post[]> {\n logger.debug(\"fetching home timeline\");\n const homeTimeline = following\n ? await this.xClient.fetchFollowingTimeline(count, [])\n : await this.xClient.fetchHomeTimeline(count, []);\n\n return homeTimeline;\n }\n\n async fetchSearchPosts(\n query: string,\n maxPosts: number,\n searchMode: SearchMode,\n cursor?: string\n ): Promise<QueryPostsResponse> {\n const timeoutPromise = new Promise((resolve) =>\n setTimeout(() => resolve({ posts: [] }), 15000)\n );\n\n const result = await this.requestQueue.add(\n async () =>\n await Promise.race([\n this.xClient.fetchSearchPosts(query, maxPosts, searchMode, cursor),\n timeoutPromise,\n ])\n );\n return (result ?? { posts: [] }) as QueryPostsResponse;\n }\n\n private async populateTimeline() {\n logger.debug(\"populating timeline...\");\n\n const cachedTimeline = await this.getCachedTimeline();\n\n if (cachedTimeline) {\n const existingMemories = await this.runtime.getMemoriesByRoomIds({\n tableName: \"messages\",\n roomIds: cachedTimeline\n .map((post) => post.conversationId)\n .filter((id): id is string => !!id)\n .map((id) => createUniqueUuid(this.runtime, id as string)),\n });\n\n const existingMemoryIds = new Set(\n existingMemories.map((memory) => memory.id?.toString()).filter((id): id is string => !!id)\n );\n\n const someCachedPostsExist = cachedTimeline.some((post) =>\n post.id ? existingMemoryIds.has(createUniqueUuid(this.runtime, post.id as string)) : false\n );\n\n if (someCachedPostsExist) {\n // Filter out the cached posts that already exist in the database\n const postsToSave = cachedTimeline.filter(\n (post) =>\n post.userId &&\n post.id &&\n post.userId !== this.profile?.id &&\n !existingMemoryIds.has(createUniqueUuid(this.runtime, post.id as string))\n );\n\n for (const post of postsToSave) {\n if (!post.id || !post.userId || !post.conversationId || !post.username) {\n logger.warn(\"Skipping post with missing required fields\");\n continue;\n }\n\n logger.log(\"Saving Post\", post.id);\n\n if (post.userId === this.profile?.id) {\n continue;\n }\n\n const worldId = createUniqueUuid(this.runtime, post.userId) as UUID;\n await this.runtime.ensureWorldExists({\n id: worldId,\n name: `${post.username}'s X`,\n agentId: this.runtime.agentId,\n messageServerId: createUniqueUuid(this.runtime, post.userId) as UUID,\n metadata: {\n ownership: { ownerId: post.userId } as unknown as WorldOwnership,\n extra: {\n x: {\n username: post.username,\n id: post.userId,\n },\n },\n },\n });\n\n const roomId = createUniqueUuid(this.runtime, post.conversationId as string);\n const entityId =\n post.userId === this.profile?.id\n ? this.runtime.agentId\n : createUniqueUuid(this.runtime, post.userId as string);\n\n await this.runtime.ensureConnection({\n entityId,\n roomId,\n userName: post.username as string,\n name: (post.name || post.username) as string,\n source: \"x\",\n type: ChannelType.FEED,\n worldId: worldId,\n });\n\n const content = {\n text: post.text || \"\",\n url: post.permanentUrl,\n source: \"x\",\n inReplyTo: post.inReplyToStatusId\n ? createUniqueUuid(this.runtime, post.inReplyToStatusId as string)\n : undefined,\n } as Content;\n\n await this.runtime.createMemory(\n {\n id: createUniqueUuid(this.runtime, post.id as string),\n entityId,\n content: content,\n agentId: this.runtime.agentId,\n roomId,\n createdAt: getEpochMs(post.timestamp),\n },\n \"messages\"\n );\n\n await this.cachePost(post);\n }\n\n logger.log(`Populated ${postsToSave.length} missing posts from the cache.`);\n return;\n }\n }\n\n const timeline = await this.fetchHomeTimeline(cachedTimeline ? 10 : 50);\n\n if (!this.profile?.username) {\n logger.warn(\"Profile username not available, skipping mentions fetch\");\n return;\n }\n\n const mentionsAndInteractions = await this.fetchSearchPosts(\n `@${this.profile.username}`,\n 20,\n SearchMode.Latest\n );\n\n const allPosts = [...timeline, ...mentionsAndInteractions.posts];\n\n const postIdsToCheck = new Set<string>();\n const roomIds = new Set<UUID>();\n\n for (const post of allPosts) {\n if (!post.id || !post.conversationId) {\n continue;\n }\n postIdsToCheck.add(post.id);\n roomIds.add(createUniqueUuid(this.runtime, post.conversationId));\n }\n\n const existingMemories = await this.runtime.getMemoriesByRoomIds({\n tableName: \"messages\",\n roomIds: Array.from(roomIds),\n });\n\n const existingMemoryIds = new Set<UUID>(\n existingMemories.map((memory) => memory.id).filter((id): id is UUID => !!id)\n );\n\n const postsToSave = allPosts.filter(\n (post) =>\n post.userId &&\n post.id &&\n post.userId !== this.profile?.id &&\n !existingMemoryIds.has(createUniqueUuid(this.runtime, post.id))\n );\n\n logger.debug({\n processingPosts: postsToSave\n .map((post) => post.id)\n .filter(Boolean)\n .join(\",\"),\n });\n\n for (const post of postsToSave) {\n if (!post.id || !post.userId || !post.conversationId || !post.username) {\n logger.warn(\"Skipping post with missing required fields\");\n continue;\n }\n\n logger.log(\"Saving Post\", post.id);\n\n if (post.userId === this.profile?.id) {\n continue;\n }\n\n const worldId = createUniqueUuid(this.runtime, post.userId) as UUID;\n await this.runtime.ensureWorldExists({\n id: worldId,\n name: `${post.username}'s X`,\n agentId: this.runtime.agentId,\n messageServerId: createUniqueUuid(this.runtime, post.userId) as UUID,\n metadata: {\n ownership: { ownerId: post.userId } as unknown as WorldOwnership,\n extra: {\n x: {\n username: post.username,\n id: post.userId,\n },\n },\n },\n });\n\n const roomId = createUniqueUuid(this.runtime, post.conversationId);\n\n const entityId =\n post.userId === this.profile?.id\n ? this.runtime.agentId\n : createUniqueUuid(this.runtime, post.userId);\n\n await this.runtime.ensureConnection({\n entityId,\n roomId,\n userName: post.username,\n name: post.name,\n source: \"x\",\n type: ChannelType.FEED,\n worldId: worldId,\n });\n\n const content = {\n text: post.text || \"\",\n url: post.permanentUrl,\n source: \"x\",\n inReplyTo: post.inReplyToStatusId\n ? createUniqueUuid(this.runtime, post.inReplyToStatusId)\n : undefined,\n } as Content;\n\n await createMemorySafe(\n this.runtime,\n {\n id: createUniqueUuid(this.runtime, post.id),\n entityId,\n content: content,\n agentId: this.runtime.agentId,\n roomId,\n createdAt: getEpochMs(post.timestamp),\n },\n \"messages\"\n );\n\n await this.cachePost(post);\n }\n\n await this.cacheTimeline(timeline);\n await this.cacheMentions(mentionsAndInteractions.posts);\n }\n\n async saveRequestMessage(message: Memory, state: State) {\n if (message.content.text) {\n const recentMessage = await this.runtime.getMemories({\n tableName: \"messages\",\n roomId: message.roomId,\n count: 1,\n unique: false,\n });\n\n if (recentMessage.length > 0 && recentMessage[0].content === message.content) {\n logger.debug(\"Message already saved\", recentMessage[0].id);\n } else {\n await createMemorySafe(this.runtime, message, \"messages\");\n }\n\n await this.runtime.evaluate(message, {\n ...state,\n xClient: this.xClient,\n });\n }\n }\n\n async loadLatestCheckedPostId(): Promise<void> {\n if (!this.profile?.username) {\n return;\n }\n const latestCheckedPostId = await this.runtime.getCache<string>(\n `x/${this.profile.username}/latest_checked_post_id`\n );\n\n if (latestCheckedPostId) {\n this.lastCheckedPostId = BigInt(latestCheckedPostId);\n }\n }\n\n async cacheLatestCheckedPostId() {\n if (this.lastCheckedPostId && this.profile?.username) {\n await this.runtime.setCache<string>(\n `x/${this.profile.username}/latest_checked_post_id`,\n this.lastCheckedPostId.toString()\n );\n }\n }\n\n async getCachedTimeline(): Promise<Post[] | undefined> {\n if (!this.profile?.username) {\n return undefined;\n }\n const cached = await this.runtime.getCache<Post[]>(`x/${this.profile.username}/timeline`);\n\n if (!cached) {\n return undefined;\n }\n\n return cached;\n }\n\n async cacheTimeline(timeline: Post[]) {\n if (!this.profile?.username) {\n return;\n }\n await this.runtime.setCache<Post[]>(`x/${this.profile.username}/timeline`, timeline);\n }\n\n async cacheMentions(mentions: Post[]) {\n if (!this.profile?.username) {\n return;\n }\n await this.runtime.setCache<Post[]>(`x/${this.profile.username}/mentions`, mentions);\n }\n\n async fetchProfile(username: string): Promise<XProfile> {\n const profile = await this.requestQueue.add(async () => {\n const profile = await this.xClient.getProfile(username);\n\n // Handle case where runtime.character might be undefined\n const defaultName = \"AI Assistant\";\n const defaultBio = \"\";\n\n let characterName = defaultName;\n let characterBio = defaultBio;\n\n if (this.runtime?.character) {\n characterName = this.runtime.character.name || defaultName;\n\n if (typeof this.runtime.character.bio === \"string\") {\n characterBio = this.runtime.character.bio;\n } else if (\n Array.isArray(this.runtime.character.bio) &&\n this.runtime.character.bio.length > 0\n ) {\n characterBio = this.runtime.character.bio[0];\n }\n }\n\n if (!profile.userId) {\n throw new Error(\"Profile missing userId\");\n }\n return {\n id: profile.userId,\n username: username || \"\",\n screenName: profile.name || characterName || \"\",\n bio: profile.biography || characterBio || \"\",\n nicknames: this.profile?.nicknames || [],\n } satisfies XProfile;\n });\n\n return profile;\n }\n\n async fetchInteractions() {\n if (!this.profile?.username) {\n return [];\n }\n const username = this.profile.username;\n const mentionsResponse = await this.requestQueue.add(() =>\n this.xClient.fetchSearchPosts(`@${username}`, 100, SearchMode.Latest)\n );\n\n return mentionsResponse.posts.map((post: Post) => this.formatPostToInteraction(post));\n }\n\n formatPostToInteraction(post: Post): XInteractionPayload | null {\n if (!post) return null;\n\n const isQuote = post.isQuoted;\n const isRepost = !!post.repostedStatus;\n const type: \"quote\" | \"repost\" | \"like\" = isQuote ? \"quote\" : isRepost ? \"repost\" : \"like\";\n\n if (!post.id || !post.userId || !post.username) {\n return null;\n }\n\n return {\n id: post.id,\n type,\n userId: post.userId,\n username: post.username,\n name: post.name || post.username,\n targetPostId: post.inReplyToStatusId || post.quotedStatusId || undefined,\n targetPost: post.quotedStatus || post,\n quotePost: isQuote ? post : undefined,\n repostId: post.repostedStatus?.id,\n };\n }\n}\n",
90
- "import type { IAgentRuntime } from \"@elizaos/core\";\n\nexport function getSetting(\n runtime: IAgentRuntime | null | undefined,\n key: string,\n defaultValue?: string\n): string | undefined {\n if (runtime && typeof runtime.getSetting === \"function\") {\n const value = runtime.getSetting(key);\n if (value !== undefined && value !== null) {\n return String(value);\n }\n }\n\n return process.env[key] ?? defaultValue;\n}\n",
91
- "import type { IAgentRuntime } from \"@elizaos/core\";\nimport { getSetting } from \"../../utils/settings\";\nimport type { XAuthProvider } from \"./types\";\n\n/**\n * Broker-ready scaffolding (stub only).\n *\n * Future contract idea (v1):\n * - GET {X_BROKER_URL}/v1/x/access-token\n * -> { access_token: string, expires_at: number }\n *\n * This plugin intentionally ships NO secrets. The broker would handle client secrets\n * and user sessions, returning short-lived access tokens to the agent.\n */\nexport class BrokerAuthProvider implements XAuthProvider {\n readonly mode = \"broker\" as const;\n\n constructor(private readonly runtime: IAgentRuntime) {}\n\n async getAccessToken(): Promise<string> {\n const url = getSetting(this.runtime, \"X_BROKER_URL\");\n if (!url) {\n throw new Error(\"X_AUTH_MODE=broker requires X_BROKER_URL (broker not implemented yet).\");\n }\n throw new Error(\n `X broker auth is not implemented yet. Configured X_BROKER_URL=${url}. ` +\n \"Broker auth requires implementing a contract to fetch short-lived access tokens.\"\n );\n }\n}\n",
92
- "import type { IAgentRuntime } from \"@elizaos/core\";\nimport { getSetting } from \"../../utils/settings\";\nimport type { OAuth1Credentials, XOAuth1Provider } from \"./types\";\n\n/**\n * Env-var auth provider (OAuth 1.0a user context).\n *\n * Configuration:\n * - X_API_KEY\n * - X_API_SECRET\n * - X_ACCESS_TOKEN\n * - X_ACCESS_TOKEN_SECRET\n */\nexport class EnvAuthProvider implements XOAuth1Provider {\n readonly mode = \"env\" as const;\n\n constructor(\n private readonly runtime?: IAgentRuntime,\n private readonly state?: Record<string, unknown>\n ) {}\n\n async getOAuth1Credentials(): Promise<OAuth1Credentials> {\n const apiKeyRaw = this.state?.X_API_KEY ?? getSetting(this.runtime, \"X_API_KEY\");\n const apiSecretKeyRaw = this.state?.X_API_SECRET ?? getSetting(this.runtime, \"X_API_SECRET\");\n const accessTokenRaw = this.state?.X_ACCESS_TOKEN ?? getSetting(this.runtime, \"X_ACCESS_TOKEN\");\n const accessTokenSecretRaw =\n this.state?.X_ACCESS_TOKEN_SECRET ?? getSetting(this.runtime, \"X_ACCESS_TOKEN_SECRET\");\n\n const apiKey = typeof apiKeyRaw === \"string\" ? apiKeyRaw : undefined;\n const apiSecretKey = typeof apiSecretKeyRaw === \"string\" ? apiSecretKeyRaw : undefined;\n const accessToken = typeof accessTokenRaw === \"string\" ? accessTokenRaw : undefined;\n const accessTokenSecret =\n typeof accessTokenSecretRaw === \"string\" ? accessTokenSecretRaw : undefined;\n\n const missing: string[] = [];\n if (!apiKey) missing.push(\"X_API_KEY\");\n if (!apiSecretKey) missing.push(\"X_API_SECRET\");\n if (!accessToken) missing.push(\"X_ACCESS_TOKEN\");\n if (!accessTokenSecret) missing.push(\"X_ACCESS_TOKEN_SECRET\");\n if (missing.length) {\n throw new Error(`Missing required X env credentials: ${missing.join(\", \")}`);\n }\n\n if (!apiKey || !apiSecretKey || !accessToken || !accessTokenSecret) {\n throw new Error(\"X credentials validation failed\");\n }\n\n return {\n appKey: apiKey,\n appSecret: apiSecretKey,\n accessToken: accessToken,\n accessSecret: accessTokenSecret,\n };\n }\n\n async getAccessToken(): Promise<string> {\n const creds = await this.getOAuth1Credentials();\n return creds.accessToken;\n }\n}\n",
93
- "import type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { getSetting } from \"../../utils/settings\";\nimport { promptForRedirectedUrl, waitForLoopbackCallback } from \"./interactive\";\nimport { createCodeChallenge, createCodeVerifier, createState } from \"./pkce\";\nimport type { StoredOAuth2Tokens, TokenStore } from \"./token-store\";\nimport { chooseDefaultTokenStore } from \"./token-store\";\nimport type { XAuthProvider } from \"./types\";\n\nconst AUTHORIZE_URL = \"https://x.com/i/oauth2/authorize\";\nconst TOKEN_URL = \"https://api.x.com/2/oauth2/token\";\n\nconst DEFAULT_SCOPES = [\"post.read\", \"post.write\", \"users.read\", \"offline.access\"].join(\" \");\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction isExpired(tokens: StoredOAuth2Tokens, skewMs = 30_000): boolean {\n return nowMs() >= tokens.expires_at - skewMs;\n}\n\nfunction formEncode(params: Record<string, string>): string {\n return Object.entries(params)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join(\"&\");\n}\n\nexport class OAuth2PKCEAuthProvider implements XAuthProvider {\n readonly mode = \"oauth\" as const;\n\n private tokens: StoredOAuth2Tokens | null = null;\n\n constructor(\n private readonly runtime: IAgentRuntime,\n private readonly tokenStore: TokenStore = chooseDefaultTokenStore(runtime),\n private readonly fetchImpl: typeof fetch = fetch,\n private readonly interactiveLoginFn?: () => Promise<StoredOAuth2Tokens>\n ) {}\n\n private get clientId(): string {\n const v = getSetting(this.runtime, \"X_CLIENT_ID\");\n if (!v) throw new Error(\"X_CLIENT_ID is required for X_AUTH_MODE=oauth\");\n return v;\n }\n\n private get redirectUri(): string {\n const v = getSetting(this.runtime, \"X_REDIRECT_URI\");\n if (!v) throw new Error(\"X_REDIRECT_URI is required for X_AUTH_MODE=oauth\");\n return v;\n }\n\n private get scopes(): string {\n return getSetting(this.runtime, \"X_SCOPES\") || DEFAULT_SCOPES;\n }\n\n private async loadTokens(): Promise<StoredOAuth2Tokens | null> {\n if (this.tokens) return this.tokens;\n this.tokens = await this.tokenStore.load();\n return this.tokens;\n }\n\n private async saveTokens(tokens: StoredOAuth2Tokens): Promise<void> {\n this.tokens = tokens;\n await this.tokenStore.save(tokens);\n }\n\n private buildAuthorizeUrl(opts: { state: string; codeChallenge: string }): string {\n const url = new URL(AUTHORIZE_URL);\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", this.clientId);\n url.searchParams.set(\"redirect_uri\", this.redirectUri);\n url.searchParams.set(\"scope\", this.scopes);\n url.searchParams.set(\"state\", opts.state);\n url.searchParams.set(\"code_challenge\", opts.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n return url.toString();\n }\n\n private async exchangeCodeForToken(params: {\n code: string;\n codeVerifier: string;\n }): Promise<StoredOAuth2Tokens> {\n const body = formEncode({\n grant_type: \"authorization_code\",\n client_id: this.clientId,\n redirect_uri: this.redirectUri,\n code: params.code,\n code_verifier: params.codeVerifier,\n });\n\n const res = await this.fetchImpl(TOKEN_URL, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n\n const json = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(`X token exchange failed (${res.status}): ${JSON.stringify(json)}`);\n }\n\n const access = json.access_token as string | undefined;\n const refresh = json.refresh_token as string | undefined;\n const expiresIn = json.expires_in as number | undefined;\n\n if (!access || typeof access !== \"string\") {\n throw new Error(\"X token exchange returned no access_token\");\n }\n if (!expiresIn || typeof expiresIn !== \"number\") {\n throw new Error(\"X token exchange returned no expires_in\");\n }\n\n return {\n access_token: access,\n refresh_token: refresh,\n expires_at: nowMs() + expiresIn * 1000,\n scope: typeof json.scope === \"string\" ? json.scope : undefined,\n token_type: typeof json.token_type === \"string\" ? json.token_type : undefined,\n };\n }\n\n private async refreshAccessToken(refreshToken: string): Promise<StoredOAuth2Tokens> {\n const body = formEncode({\n grant_type: \"refresh_token\",\n client_id: this.clientId,\n refresh_token: refreshToken,\n });\n\n const res = await this.fetchImpl(TOKEN_URL, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n\n const json = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(`X token refresh failed (${res.status}): ${JSON.stringify(json)}`);\n }\n\n const access = json.access_token as string | undefined;\n const refresh = (json.refresh_token as string | undefined) ?? refreshToken;\n const expiresIn = json.expires_in as number | undefined;\n\n if (!access || typeof access !== \"string\") {\n throw new Error(\"X token refresh returned no access_token\");\n }\n if (!expiresIn || typeof expiresIn !== \"number\") {\n throw new Error(\"X token refresh returned no expires_in\");\n }\n\n return {\n access_token: access,\n refresh_token: refresh,\n expires_at: nowMs() + expiresIn * 1000,\n scope: typeof json.scope === \"string\" ? json.scope : undefined,\n token_type: typeof json.token_type === \"string\" ? json.token_type : undefined,\n };\n }\n\n private async interactiveLogin(): Promise<StoredOAuth2Tokens> {\n const verifier = createCodeVerifier();\n const challenge = createCodeChallenge(verifier);\n const state = createState();\n const authorizeUrl = this.buildAuthorizeUrl({\n state,\n codeChallenge: challenge,\n });\n\n logger.info(\"X OAuth (PKCE) setup required.\");\n logger.info(`Open this URL to authorize: ${authorizeUrl}`);\n\n let code: string | undefined;\n try {\n // Preferred UX: loopback callback if redirect URI is loopback.\n const cb = await waitForLoopbackCallback(this.redirectUri, state);\n code = cb.code;\n } catch (e) {\n logger.warn(\n `Could not start loopback callback server (will fall back to paste URL): ${e instanceof Error ? e.message : String(e)}`\n );\n }\n\n if (!code) {\n const redirected = await promptForRedirectedUrl(\n \"Paste the FULL redirected URL here (it contains ?code=...&state=...): \"\n );\n const parsed = new URL(redirected);\n const parsedCode = parsed.searchParams.get(\"code\");\n const parsedState = parsed.searchParams.get(\"state\");\n if (!parsedCode) throw new Error(\"Pasted URL did not include ?code=\");\n if (parsedState && parsedState !== state) {\n throw new Error(\"OAuth state mismatch\");\n }\n code = parsedCode;\n }\n\n return await this.exchangeCodeForToken({ code, codeVerifier: verifier });\n }\n\n async getAccessToken(): Promise<string> {\n const tokens = await this.loadTokens();\n if (!tokens) {\n const newTokens = this.interactiveLoginFn\n ? await this.interactiveLoginFn()\n : await this.interactiveLogin();\n await this.saveTokens(newTokens);\n return newTokens.access_token;\n }\n\n if (!isExpired(tokens)) {\n return tokens.access_token;\n }\n\n if (!tokens.refresh_token) {\n // No refresh token available; must re-auth.\n await this.tokenStore.clear();\n this.tokens = null;\n const newTokens = this.interactiveLoginFn\n ? await this.interactiveLoginFn()\n : await this.interactiveLogin();\n await this.saveTokens(newTokens);\n return newTokens.access_token;\n }\n\n const refreshed = await this.refreshAccessToken(tokens.refresh_token);\n await this.saveTokens(refreshed);\n return refreshed.access_token;\n }\n}\n\nexport const OAUTH2_DEFAULT_SCOPES = DEFAULT_SCOPES;\n",
94
- "import { createServer } from \"node:http\";\nimport * as readline from \"node:readline\";\nimport { URL } from \"node:url\";\nimport { logger } from \"@elizaos/core\";\n\nexport interface OAuthCallbackResult {\n code: string;\n state?: string;\n}\n\nfunction canPrompt(): boolean {\n return !!process.stdin && !!process.stdout && process.stdin.isTTY === true;\n}\n\nexport async function promptForRedirectedUrl(promptText: string): Promise<string> {\n if (!canPrompt()) {\n throw new Error(\n \"X OAuth requires interactive setup, but stdin is not a TTY. \" +\n \"Re-run with an interactive terminal or use a runtime with persistent settings storage.\"\n );\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = (q: string) => new Promise<string>((resolve) => rl.question(q, resolve));\n\n try {\n const answer = await question(promptText);\n return answer.trim();\n } finally {\n rl.close();\n }\n}\n\nexport async function waitForLoopbackCallback(\n redirectUri: string,\n expectedState: string,\n timeoutMs = 5 * 60 * 1000\n): Promise<OAuthCallbackResult> {\n const url = new URL(redirectUri);\n if (url.hostname !== \"127.0.0.1\" && url.hostname !== \"localhost\") {\n throw new Error(\n `Redirect URI must be loopback (127.0.0.1/localhost) to use local callback server; got ${url.hostname}`\n );\n }\n\n // Avoid privileged ports by default. If the user doesn't specify a port, use 8080.\n const port = Number(url.port || \"8080\");\n const path = url.pathname || \"/\";\n\n return await new Promise<OAuthCallbackResult>((resolve, reject) => {\n let settled = false;\n\n const finish = (err?: Error, value?: OAuthCallbackResult) => {\n if (settled) return;\n settled = true;\n if (err) reject(err);\n else if (value) resolve(value);\n else reject(new Error(\"OAuth callback finished without result\"));\n try {\n server.close();\n } catch {\n // ignore\n }\n };\n\n const server = createServer((req, res) => {\n try {\n const reqUrl = new URL(req.url ?? \"\", `http://${url.hostname}:${port}`);\n if (reqUrl.pathname !== path) {\n res.writeHead(404);\n res.end(\"Not Found\");\n return;\n }\n\n const code = reqUrl.searchParams.get(\"code\");\n const state = reqUrl.searchParams.get(\"state\") ?? undefined;\n const error = reqUrl.searchParams.get(\"error\");\n const errorDesc = reqUrl.searchParams.get(\"error_description\");\n\n if (error) {\n res.writeHead(400, { \"content-type\": \"text/plain\" });\n res.end(`OAuth error: ${error}${errorDesc ? ` - ${errorDesc}` : \"\"}`);\n finish(new Error(`OAuth error: ${error}${errorDesc ? ` - ${errorDesc}` : \"\"}`));\n return;\n }\n\n if (!code) {\n res.writeHead(400, { \"content-type\": \"text/plain\" });\n res.end(\"Missing code\");\n finish(new Error(\"Missing code\"));\n return;\n }\n\n if (state && state !== expectedState) {\n res.writeHead(400, { \"content-type\": \"text/plain\" });\n res.end(\"State mismatch\");\n finish(new Error(\"OAuth state mismatch\"));\n return;\n }\n\n res.writeHead(200, { \"content-type\": \"text/plain\" });\n res.end(\"X auth completed. You can close this tab.\");\n finish(undefined, { code, state });\n } catch (e) {\n finish(e instanceof Error ? e : new Error(String(e)));\n }\n });\n\n const timer = setTimeout(() => {\n finish(new Error(\"Timed out waiting for X OAuth callback\"));\n }, timeoutMs);\n\n server.on(\"close\", () => clearTimeout(timer));\n server.once(\"error\", (err: unknown) => {\n // EADDRINUSE / EACCES / etc. should fail fast instead of hanging until timeout.\n const errorObj = err as { code?: string; message?: string };\n const code = errorObj?.code ? ` (${errorObj.code})` : \"\";\n finish(new Error(`OAuth callback server error${code}: ${errorObj?.message ?? String(err)}`));\n });\n server.listen(port, url.hostname, () => {\n logger.info(`X OAuth callback server listening on http://${url.hostname}:${port}${path}`);\n });\n });\n}\n",
95
- "import { createHash, randomBytes } from \"node:crypto\";\n\nexport function base64UrlEncode(input: Buffer): string {\n return input.toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n}\n\nexport function createCodeVerifier(byteLength = 32): string {\n // RFC 7636: code_verifier length 43-128 chars. 32 bytes => 43 chars in base64url.\n return base64UrlEncode(randomBytes(byteLength));\n}\n\nexport function createCodeChallenge(verifier: string): string {\n const hash = createHash(\"sha256\").update(verifier).digest();\n return base64UrlEncode(hash);\n}\n\nexport function createState(byteLength = 16): string {\n return base64UrlEncode(randomBytes(byteLength));\n}\n",
96
- "import { promises as fs } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\n\nexport interface StoredOAuth2Tokens {\n access_token: string;\n refresh_token?: string;\n expires_at: number; // epoch ms\n scope?: string;\n token_type?: string;\n}\n\nexport interface TokenStore {\n load(): Promise<StoredOAuth2Tokens | null>;\n save(tokens: StoredOAuth2Tokens): Promise<void>;\n clear(): Promise<void>;\n}\n\nexport class RuntimeCacheTokenStore implements TokenStore {\n private readonly key: string;\n constructor(\n private readonly runtime: IAgentRuntime,\n key?: string\n ) {\n this.key = key ?? `x/oauth2/tokens/${runtime.agentId}`;\n }\n\n async load(): Promise<StoredOAuth2Tokens | null> {\n try {\n const v = await this.runtime.getCache<StoredOAuth2Tokens>(this.key);\n return v ?? null;\n } catch {\n return null;\n }\n }\n\n async save(tokens: StoredOAuth2Tokens): Promise<void> {\n await this.runtime.setCache(this.key, tokens);\n }\n\n async clear(): Promise<void> {\n // Use deleteCache for proper deletion semantics\n await this.runtime.deleteCache(this.key);\n }\n}\n\nexport class FileTokenStore implements TokenStore {\n constructor(private readonly path: string) {}\n\n static defaultPath(): string {\n // Explicit warning is logged by the provider when this fallback is used.\n return join(homedir(), \".eliza\", \"x\", \"oauth2.tokens.json\");\n }\n\n async load(): Promise<StoredOAuth2Tokens | null> {\n try {\n const raw = await fs.readFile(this.path, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== \"object\") return null;\n if (typeof parsed.access_token !== \"string\") return null;\n if (typeof parsed.expires_at !== \"number\") return null;\n return parsed as StoredOAuth2Tokens;\n } catch {\n return null;\n }\n }\n\n async save(tokens: StoredOAuth2Tokens): Promise<void> {\n // Ensure token directory + file are owner-only (defense-in-depth for shared machines).\n await fs.mkdir(dirname(this.path), { recursive: true, mode: 0o700 });\n await fs.writeFile(this.path, JSON.stringify(tokens, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n // Some platforms ignore mode on write when file already exists; enforce explicitly.\n try {\n await fs.chmod(this.path, 0o600);\n } catch {\n // ignore\n }\n }\n\n async clear(): Promise<void> {\n try {\n await fs.unlink(this.path);\n } catch {\n // ignore\n }\n }\n}\n\nexport function chooseDefaultTokenStore(runtime: IAgentRuntime | undefined): TokenStore {\n if (runtime && typeof runtime.getCache === \"function\" && typeof runtime.setCache === \"function\") {\n return new RuntimeCacheTokenStore(runtime);\n }\n\n logger.warn(\n \"X OAuth token persistence: runtime cache API not available; falling back to local token file. \" +\n \"This file contains sensitive tokens—protect it and rotate tokens if compromised.\"\n );\n return new FileTokenStore(FileTokenStore.defaultPath());\n}\n",
97
- "import type { IAgentRuntime } from \"@elizaos/core\";\nimport { getSetting } from \"../../utils/settings\";\nimport { BrokerAuthProvider } from \"./broker\";\nimport { EnvAuthProvider } from \"./env\";\nimport { OAuth2PKCEAuthProvider } from \"./oauth2-pkce\";\nimport type { XAuthMode, XAuthProvider } from \"./types\";\n\nfunction normalizeMode(v: string | undefined | null): XAuthMode {\n const mode = (v ?? \"env\").toLowerCase();\n if (mode === \"env\" || mode === \"oauth\" || mode === \"broker\") return mode;\n throw new Error(`Invalid X_AUTH_MODE=${v}. Expected env|oauth|broker.`);\n}\n\nexport function getXAuthMode(runtime?: IAgentRuntime, state?: Record<string, unknown>): XAuthMode {\n const modeRaw = state?.X_AUTH_MODE ?? getSetting(runtime ?? null, \"X_AUTH_MODE\");\n const mode = typeof modeRaw === \"string\" ? modeRaw : undefined;\n return normalizeMode(mode ?? \"env\");\n}\n\nexport function createXAuthProvider(\n runtime: IAgentRuntime,\n state?: Record<string, unknown>\n): XAuthProvider {\n const mode = getXAuthMode(runtime, state);\n switch (mode) {\n case \"env\":\n return new EnvAuthProvider(runtime, state);\n case \"oauth\":\n return new OAuth2PKCEAuthProvider(runtime);\n case \"broker\":\n return new BrokerAuthProvider(runtime);\n }\n}\n",
98
- "import { TwitterApi } from \"twitter-api-v2\";\nimport type { XAuthProvider, XOAuth1Provider } from \"./auth-providers/types\";\nimport type { Profile } from \"./profile\";\n\n/**\n * X API v2 authentication using developer credentials\n */\nexport class XAuth {\n private v2Client: TwitterApi | null = null;\n private authenticated = false;\n private profile?: Profile;\n private loggedOut = false;\n\n private lastAccessToken?: string;\n\n constructor(private readonly provider: XAuthProvider) {\n // OAuth1 provider is considered authenticated immediately\n if (\"getOAuth1Credentials\" in provider && typeof provider.getOAuth1Credentials === \"function\") {\n this.authenticated = true;\n }\n }\n\n private isOAuth1Provider(p: XAuthProvider): p is XOAuth1Provider {\n return \"getOAuth1Credentials\" in p && typeof p.getOAuth1Credentials === \"function\";\n }\n\n private async ensureClientInitialized(): Promise<void> {\n if (this.loggedOut) {\n throw new Error(\"X API client not initialized\");\n }\n if (this.isOAuth1Provider(this.provider)) {\n if (this.v2Client) return;\n const creds = await this.provider.getOAuth1Credentials();\n this.v2Client = new TwitterApi({\n appKey: creds.appKey,\n appSecret: creds.appSecret,\n accessToken: creds.accessToken,\n accessSecret: creds.accessSecret,\n });\n this.authenticated = true;\n this.lastAccessToken = creds.accessToken;\n return;\n }\n\n const token = await this.provider.getAccessToken();\n if (!this.v2Client || this.lastAccessToken !== token) {\n // OAuth2 user context token: Bearer token\n this.v2Client = new TwitterApi(token);\n this.authenticated = true;\n this.lastAccessToken = token;\n }\n }\n\n /**\n * Get the X API v2 client\n */\n async getV2Client(): Promise<TwitterApi> {\n await this.ensureClientInitialized();\n if (!this.v2Client) {\n throw new Error(\"X API client not initialized\");\n }\n return this.v2Client;\n }\n\n /**\n * Check if authenticated\n */\n async isLoggedIn(): Promise<boolean> {\n try {\n await this.ensureClientInitialized();\n } catch {\n return false;\n }\n if (!this.authenticated || !this.v2Client) {\n return false;\n }\n\n try {\n // Verify credentials by getting current user\n const me = await this.v2Client.v2.me();\n return !!me.data;\n } catch (error) {\n console.error(\"Failed to verify authentication:\", error);\n return false;\n }\n }\n\n /**\n * Get current user profile\n */\n async me(): Promise<Profile | undefined> {\n if (this.profile) {\n return this.profile;\n }\n\n await this.ensureClientInitialized();\n if (!this.v2Client) {\n throw new Error(\"Not authenticated\");\n }\n\n try {\n const { data: user } = await this.v2Client.v2.me({\n \"user.fields\": [\n \"id\",\n \"name\",\n \"username\",\n \"description\",\n \"profile_image_url\",\n \"public_metrics\",\n \"verified\",\n \"location\",\n \"created_at\",\n ],\n });\n\n this.profile = {\n userId: user.id,\n username: user.username,\n name: user.name,\n biography: user.description,\n avatar: user.profile_image_url,\n followersCount: user.public_metrics?.followers_count,\n followingCount: user.public_metrics?.following_count,\n isVerified: user.verified,\n location: user.location || \"\",\n joined: user.created_at ? new Date(user.created_at) : undefined,\n };\n\n return this.profile;\n } catch (error) {\n console.error(\"Failed to get user profile:\", error);\n return undefined;\n }\n }\n\n /**\n * Logout (clear credentials)\n */\n async logout(): Promise<void> {\n this.v2Client = null;\n this.authenticated = false;\n this.profile = undefined;\n this.lastAccessToken = undefined;\n this.loggedOut = true;\n }\n\n /**\n * For compatibility - always returns true since we use API keys\n */\n hasToken(): boolean {\n return this.authenticated && !this.loggedOut;\n }\n}\n",
99
- "import type { RequestApiResult } from \"./api-types\";\nimport type { XAuth } from \"./auth\";\nimport type { XApiErrorRaw } from \"./errors\";\n\n/**\n * Interface representing a raw user object from the X API.\n * @typedef {Object} XUserRaw\n * @property {string} [created_at] - The date the user was created.\n * @property {string} [description] - The user's description.\n * @property {Object} [entities] - Additional entities associated with the user.\n * @property {Object} [url] - The URL associated with the user.\n * @property {Object[]} [urls] - Array of URLs associated with the user.\n * @property {string} [expanded_url] - The expanded URL.\n * @property {number} [favourites_count] - The number of favorited items.\n * @property {number} [followers_count] - The number of followers.\n * @property {number} [friends_count] - The number of friends.\n * @property {number} [media_count] - The number of media items.\n * @property {number} [statuses_count] - The number of statuses.\n * @property {string} [id_str] - The user ID as a string.\n * @property {number} [listed_count] - The number of lists the user is listed in.\n * @property {string} [name] - The user's name.\n * @property {string} location - The user's location.\n * @property {boolean} [geo_enabled] - Indicates if geo locations are enabled.\n * @property {string[]} [pinned_tweet_ids_str] - Array of pinned post IDs as strings.\n * @property {string} [profile_background_color] - The background color of the user's profile.\n * @property {string} [profile_banner_url] - The URL of the user's profile banner.\n * @property {string} [profile_image_url_https] - The URL of the user's profile image (HTTPS).\n * @property {boolean} [protected] - Indicates if the user's account is protected.\n * @property {string} [screen_name] - The user's screen name.\n * @property {boolean} [verified] - Indicates if the user is verified.\n * @property {boolean} [has_custom_timelines] - Indicates if the user has custom timelines.\n * @property {boolean} [has_extended_profile] - Indicates if the user has an extended profile.\n * @property {string} [url] - The user's URL.\n * @property {boolean} [can_dm] - Indicates if direct messages are enabled for the user.\n */\nexport interface XUserRaw {\n created_at?: string;\n description?: string;\n entities?: {\n url?: {\n urls?: {\n expanded_url?: string;\n }[];\n };\n };\n favourites_count?: number;\n followers_count?: number;\n friends_count?: number;\n media_count?: number;\n statuses_count?: number;\n id_str?: string;\n listed_count?: number;\n name?: string;\n location: string;\n geo_enabled?: boolean;\n pinned_tweet_ids_str?: string[];\n profile_background_color?: string;\n profile_banner_url?: string;\n profile_image_url_https?: string;\n protected?: boolean;\n screen_name?: string;\n verified?: boolean;\n has_custom_timelines?: boolean;\n has_extended_profile?: boolean;\n url?: string;\n can_dm?: boolean;\n}\n\n/**\n * A parsed profile object.\n */\n/**\n * Interface representing a user profile.\n * @typedef {Object} Profile\n * @property {string} [avatar] - The URL to the user's avatar.\n * @property {string} [banner] - The URL to the user's banner image.\n * @property {string} [biography] - The user's biography.\n * @property {string} [birthday] - The user's birthday.\n * @property {number} [followersCount] - The number of followers the user has.\n * @property {number} [followingCount] - The number of users the user is following.\n * @property {number} [friendsCount] - The number of friends the user has.\n * @property {number} [mediaCount] - The number of media items the user has posted.\n * @property {number} [statusesCount] - The number of statuses the user has posted.\n * @property {boolean} [isPrivate] - Indicates if the user's profile is private.\n * @property {boolean} [isVerified] - Indicates if the user account is verified.\n * @property {boolean} [isBlueVerified] - Indicates if the user account has blue verification badge.\n * @property {Date} [joined] - The date the user joined the platform.\n * @property {number} [likesCount] - The number of likes the user has received.\n * @property {number} [listedCount] - The number of times the user has been listed.\n * @property {string} location - The user's location.\n * @property {string} [name] - The user's name.\n * @property {string[]} [pinnedPostIds] - The IDs of the user's pinned posts.\n * @property {number} [postsCount] - The number of posts the user has posted.\n * @property {string} [url] - The user's website URL.\n * @property {string} [userId] - The unique user ID.\n * @property {string} [username] - The user's username.\n * @property {string} [website] - The user's website.\n * @property {boolean} [canDm] - Indicates if the user can receive direct messages.\n */\nexport interface Profile {\n avatar?: string;\n banner?: string;\n biography?: string;\n birthday?: string;\n followersCount?: number;\n followingCount?: number;\n friendsCount?: number;\n mediaCount?: number;\n statusesCount?: number;\n isPrivate?: boolean;\n isVerified?: boolean;\n isBlueVerified?: boolean;\n joined?: Date;\n likesCount?: number;\n listedCount?: number;\n location: string;\n name?: string;\n pinnedPostIds?: string[];\n postsCount?: number;\n url?: string;\n userId?: string;\n username?: string;\n website?: string;\n canDm?: boolean;\n}\n\nexport interface UserRaw {\n data: {\n user: {\n result: {\n rest_id?: string;\n is_blue_verified?: boolean;\n legacy: XUserRaw;\n };\n };\n };\n errors?: XApiErrorRaw[];\n}\n\nfunction getAvatarOriginalSizeUrl(avatarUrl: string | undefined) {\n return avatarUrl ? avatarUrl.replace(\"_normal\", \"\") : undefined;\n}\n\nexport function parseProfile(user: XUserRaw, isBlueVerified?: boolean): Profile {\n const profile: Profile = {\n avatar: getAvatarOriginalSizeUrl(user.profile_image_url_https),\n banner: user.profile_banner_url,\n biography: user.description,\n followersCount: user.followers_count,\n followingCount: user.friends_count,\n friendsCount: user.friends_count,\n mediaCount: user.media_count,\n isPrivate: user.protected ?? false,\n isVerified: user.verified,\n likesCount: user.favourites_count,\n listedCount: user.listed_count,\n location: user.location,\n name: user.name,\n pinnedPostIds: user.pinned_tweet_ids_str,\n postsCount: user.statuses_count,\n url: `https://x.com/${user.screen_name}`,\n userId: user.id_str,\n username: user.screen_name,\n isBlueVerified: isBlueVerified ?? false,\n canDm: user.can_dm,\n };\n\n if (user.created_at != null) {\n profile.joined = new Date(Date.parse(user.created_at));\n }\n\n const urls = user.entities?.url?.urls;\n if (urls?.length != null && urls?.length > 0) {\n profile.website = urls[0].expanded_url;\n }\n\n return profile;\n}\n\nimport type { UserV2 } from \"twitter-api-v2\";\n\n/**\n * Convert X API v2 user data to Profile format\n */\nfunction parseV2Profile(user: UserV2): Profile {\n const profile: Profile = {\n avatar: getAvatarOriginalSizeUrl(user.profile_image_url),\n biography: user.description,\n followersCount: user.public_metrics?.followers_count,\n followingCount: user.public_metrics?.following_count,\n friendsCount: user.public_metrics?.following_count,\n postsCount: user.public_metrics?.tweet_count,\n isPrivate: user.protected ?? false,\n isVerified: user.verified ?? false,\n likesCount: user.public_metrics?.like_count,\n listedCount: user.public_metrics?.listed_count,\n location: user.location || \"\",\n name: user.name,\n pinnedPostIds: user.pinned_tweet_id ? [user.pinned_tweet_id] : [],\n url: `https://x.com/${user.username}`,\n userId: user.id,\n username: user.username,\n isBlueVerified: user.verified_type === \"blue\",\n };\n\n if (user.created_at) {\n profile.joined = new Date(user.created_at);\n }\n\n if (user.entities?.url?.urls && user.entities.url.urls.length > 0) {\n profile.website = user.entities.url.urls[0]?.expanded_url;\n }\n\n return profile;\n}\n\nexport async function getProfile(\n username: string,\n auth: XAuth\n): Promise<RequestApiResult<Profile>> {\n if (!auth) {\n return {\n success: false,\n err: new Error(\"Not authenticated\"),\n };\n }\n\n try {\n const client = await auth.getV2Client();\n const user = await client.v2.userByUsername(username, {\n \"user.fields\": [\n \"id\",\n \"name\",\n \"username\",\n \"created_at\",\n \"description\",\n \"entities\",\n \"location\",\n \"pinned_tweet_id\",\n \"profile_image_url\",\n \"protected\",\n \"public_metrics\",\n \"url\",\n \"verified\",\n \"verified_type\",\n ],\n });\n\n if (!user.data) {\n return {\n success: false,\n err: new Error(`User ${username} not found`),\n };\n }\n\n return {\n success: true,\n value: parseV2Profile(user.data),\n };\n } catch (error) {\n return {\n success: false,\n err: new Error(error instanceof Error ? error.message : \"Failed to fetch profile\"),\n };\n }\n}\n\nconst idCache = new Map<string, string>();\n\nexport async function getScreenNameByUserId(\n userId: string,\n auth: XAuth\n): Promise<RequestApiResult<string>> {\n if (!auth) {\n return {\n success: false,\n err: new Error(\"Not authenticated\"),\n };\n }\n\n try {\n const client = await auth.getV2Client();\n const user = await client.v2.user(userId, {\n \"user.fields\": [\"username\"],\n });\n\n if (!user.data || !user.data.username) {\n return {\n success: false,\n err: new Error(`User with ID ${userId} not found`),\n };\n }\n\n return {\n success: true,\n value: user.data.username,\n };\n } catch (error) {\n return {\n success: false,\n err: new Error(error instanceof Error ? error.message : \"Failed to fetch user\"),\n };\n }\n}\n\nexport async function getEntityIdByScreenName(\n screenName: string,\n auth: XAuth\n): Promise<RequestApiResult<string>> {\n const cached = idCache.get(screenName);\n if (cached != null) {\n return { success: true, value: cached };\n }\n\n const profileRes = await getProfile(screenName, auth);\n if (!profileRes.success) {\n return { success: false, err: profileRes.err };\n }\n\n const profile = profileRes.value;\n if (profile.userId != null) {\n idCache.set(screenName, profile.userId);\n\n return {\n success: true,\n value: profile.userId,\n };\n }\n\n return {\n success: false,\n err: new Error(\"User ID is undefined.\"),\n };\n}\n",
100
- "import type {\n ApiV2Includes,\n MediaObjectV2,\n PlaceV2,\n PollV2,\n ReferencedTweetV2,\n TTweetv2Expansion,\n TTweetv2MediaField,\n TTweetv2PlaceField,\n TTweetv2PollField,\n TTweetv2TweetField,\n TTweetv2UserField,\n TweetEntityHashtagV2,\n TweetEntityMentionV2,\n TweetEntityUrlV2,\n TweetV2,\n UserV2,\n} from \"twitter-api-v2\";\nimport type { XAuth } from \"./auth\";\nimport { getEntityIdByScreenName } from \"./profile\";\nimport type { QueryPostsResponse } from \"./types\";\n\n// Type aliases for X naming convention\ntype PostV2 = TweetV2;\ntype TPostv2Expansion = TTweetv2Expansion;\ntype TPostv2MediaField = TTweetv2MediaField;\ntype TPostv2PlaceField = TTweetv2PlaceField;\ntype TPostv2PollField = TTweetv2PollField;\ntype TPostv2PostField = TTweetv2TweetField;\ntype TPostv2UserField = TTweetv2UserField;\n\n/**\n * Default options for X API v2 request parameters.\n * @typedef {Object} defaultOptions\n * @property {TPostv2Expansion[]} expansions - List of expansions to include in the request.\n * @property {TPostv2PostField[]} postFields - List of post fields to include in the request.\n * @property {TPostv2PollField[]} pollFields - List of poll fields to include in the request.\n * @property {TPostv2MediaField[]} mediaFields - List of media fields to include in the request.\n * @property {TPostv2UserField[]} userFields - List of user fields to include in the request.\n * @property {TPostv2PlaceField[]} placeFields - List of place fields to include in the request.\n */\nexport const defaultOptions = {\n expansions: [\n \"attachments.poll_ids\",\n \"attachments.media_keys\",\n \"author_id\",\n \"referenced_tweets.id\",\n \"in_reply_to_user_id\",\n \"edit_history_post_ids\",\n \"geo.place_id\",\n \"entities.mentions.username\",\n \"referenced_tweets.id.author_id\",\n ] as TPostv2Expansion[],\n postFields: [\n \"attachments\",\n \"author_id\",\n \"context_annotations\",\n \"conversation_id\",\n \"created_at\",\n \"entities\",\n \"geo\",\n \"id\",\n \"in_reply_to_user_id\",\n \"lang\",\n \"public_metrics\",\n \"edit_controls\",\n \"possibly_sensitive\",\n \"referenced_tweets\",\n \"reply_settings\",\n \"source\",\n \"text\",\n \"withheld\",\n \"note_post\",\n ] as TPostv2PostField[],\n pollFields: [\n \"duration_minutes\",\n \"end_datetime\",\n \"id\",\n \"options\",\n \"voting_status\",\n ] as TPostv2PollField[],\n mediaFields: [\n \"duration_ms\",\n \"height\",\n \"media_key\",\n \"preview_image_url\",\n \"type\",\n \"url\",\n \"width\",\n \"public_metrics\",\n \"alt_text\",\n \"variants\",\n ] as TPostv2MediaField[],\n userFields: [\n \"created_at\",\n \"description\",\n \"entities\",\n \"id\",\n \"location\",\n \"name\",\n \"profile_image_url\",\n \"protected\",\n \"public_metrics\",\n \"url\",\n \"username\",\n \"verified\",\n \"withheld\",\n ] as TPostv2UserField[],\n placeFields: [\n \"contained_within\",\n \"country\",\n \"country_code\",\n \"full_name\",\n \"geo\",\n \"id\",\n \"name\",\n \"place_type\",\n ] as TPostv2PlaceField[],\n};\n/**\n * Interface representing a mention.\n * @typedef {Object} Mention\n * @property {string} id - The unique identifier for the mention.\n * @property {string} [username] - The username associated with the mention.\n * @property {string} [name] - The name associated with the mention.\n */\nexport interface Mention {\n id: string;\n username?: string;\n name?: string;\n}\n\n/**\n * Interface representing a photo object.\n * @interface\n * @property {string} id - The unique identifier for the photo.\n * @property {string} url - The URL for the photo image.\n * @property {string} [alt_text] - The alternative text for the photo image. Optional.\n */\nexport interface Photo {\n id: string;\n url: string;\n alt_text: string | undefined;\n}\n\n/**\n * Interface representing a video object.\n * @typedef {Object} Video\n * @property {string} id - The unique identifier for the video.\n * @property {string} preview - The URL for the preview image of the video.\n * @property {string} [url] - The optional URL for the video.\n */\n\nexport interface Video {\n id: string;\n preview: string;\n url?: string;\n}\n\n/**\n * Interface representing a raw place object.\n * @typedef {Object} PlaceRaw\n * @property {string} [id] - The unique identifier of the place.\n * @property {string} [place_type] - The type of the place.\n * @property {string} [name] - The name of the place.\n * @property {string} [full_name] - The full name of the place.\n * @property {string} [country_code] - The country code of the place.\n * @property {string} [country] - The country name of the place.\n * @property {Object} [bounding_box] - The bounding box coordinates of the place.\n * @property {string} [bounding_box.type] - The type of the bounding box.\n * @property {number[][][]} [bounding_box.coordinates] - The coordinates of the bounding box in an array format.\n */\nexport interface PlaceRaw {\n id?: string;\n place_type?: string;\n name?: string;\n full_name?: string;\n country_code?: string;\n country?: string;\n bounding_box?: {\n type?: string;\n coordinates?: number[][][];\n };\n}\n\n/**\n * Interface representing poll data.\n *\n * @property {string} [id] - The unique identifier for the poll.\n * @property {string} [end_datetime] - The end date and time for the poll.\n * @property {string} [voting_status] - The status of the voting process.\n * @property {number} duration_minutes - The duration of the poll in minutes.\n * @property {PollOption[]} options - An array of poll options.\n */\nexport interface PollData {\n id?: string;\n end_datetime?: string;\n voting_status?: string;\n duration_minutes: number;\n options: PollOption[];\n}\n\n/**\n * Interface representing a poll option.\n * @typedef {Object} PollOption\n * @property {number} [position] - The position of the option.\n * @property {string} label - The label of the option.\n * @property {number} [votes] - The number of votes for the option.\n */\nexport interface PollOption {\n position?: number;\n label: string;\n votes?: number;\n}\n\n/**\n * A parsed Post object.\n */\n/**\n * Represents a Post on X.\n * @typedef { Object } Post\n * @property { number } [bookmarkCount] - The number of times this Post has been bookmarked.\n * @property { string } [conversationId] - The ID of the conversation this Post is a part of.\n * @property {string[]} hashtags - An array of hashtags mentioned in the Post.\n * @property { string } [html] - The HTML content of the Post.\n * @property { string } [id] - The unique ID of the Post.\n * @property { Post } [inReplyToStatus] - The Post that this Post is in reply to.\n * @property { string } [inReplyToStatusId] - The ID of the Post that this Post is in reply to.\n * @property { boolean } [isQuoted] - Indicates if this Post is a quote of another Post.\n * @property { boolean } [isPin] - Indicates if this Post is pinned.\n * @property { boolean } [isReply] - Indicates if this Post is a reply to another Post.\n * @property { boolean } [isRepost] - Indicates if this Post is a repost.\n * @property { boolean } [isSelfThread] - Indicates if this Post is part of a self thread.\n * @property { string } [language] - The language of the Post.\n * @property { number } [likes] - The number of likes on the Post.\n * @property { string } [name] - The name associated with the Post.\n * @property {Mention[]} mentions - An array of mentions in the Post.\n * @property { string } [permanentUrl] - The permanent URL of the Post.\n * @property {Photo[]} photos - An array of photos attached to the Post.\n * @property { PlaceRaw } [place] - The place associated with the Post.\n * @property { Post } [quotedStatus] - The quoted Post.\n * @property { string } [quotedStatusId] - The ID of the quoted Post.\n * @property { number } [quotes] - The number of times this Post has been quoted.\n * @property { number } [replies] - The number of replies to the Post.\n * @property { number } [reposts] - The number of reposts on the Post.\n * @property { Post } [repostedStatus] - The status that was reposted.\n * @property { string } [repostedStatusId] - The ID of the reposted status.\n * @property { string } [text] - The text content of the Post.\n * @property {Post[]} thread - An array representing an X thread.\n * @property { Date } [timeParsed] - The parsed timestamp of the Post.\n * @property { number } [timestamp] - The timestamp of the Post.\n * @property {string[]} urls - An array of URLs mentioned in the Post.\n * @property { string } [userId] - The ID of the user who posted the Post.\n * @property { string } [username] - The username of the user who posted the Post.\n * @property {Video[]} videos - An array of videos attached to the Post.\n * @property { number } [views] - The number of views on the Post.\n * @property { boolean } [sensitiveContent] - Indicates if the Post contains sensitive content.\n * @property {PollV2 | null} [poll] - The poll attached to the Post, if any.\n */\nexport interface Post {\n bookmarkCount?: number;\n conversationId?: string;\n hashtags: string[];\n html?: string;\n id?: string;\n inReplyToStatus?: Post;\n inReplyToStatusId?: string;\n isQuoted?: boolean;\n isPin?: boolean;\n isReply?: boolean;\n isRepost?: boolean;\n isSelfThread?: boolean;\n language?: string;\n likes?: number;\n name?: string;\n mentions: Mention[];\n permanentUrl?: string;\n photos: Photo[];\n place?: PlaceRaw;\n quotedStatus?: Post;\n quotedStatusId?: string;\n quotes?: number;\n replies?: number;\n reposts?: number;\n repostedStatus?: Post;\n repostedStatusId?: string;\n text?: string;\n thread: Post[];\n timeParsed?: Date;\n timestamp?: number;\n urls: string[];\n userId?: string;\n username?: string;\n videos: Video[];\n views?: number;\n sensitiveContent?: boolean;\n poll?: PollV2 | null;\n}\n\nexport interface Reposter {\n rest_id: string;\n screen_name: string;\n name: string;\n description?: string;\n}\n\nexport type PostQuery = Partial<Post> | ((post: Post) => boolean | Promise<boolean>);\n\nexport async function fetchPosts(\n userId: string,\n maxPosts: number,\n cursor: string | undefined,\n auth: XAuth\n): Promise<QueryPostsResponse> {\n const client = await auth.getV2Client();\n\n try {\n const response = await client.v2.userTimeline(userId, {\n max_results: Math.min(maxPosts, 100),\n exclude: [\"retweets\", \"replies\"],\n \"tweet.fields\": [\n \"id\",\n \"text\",\n \"created_at\",\n \"author_id\",\n \"referenced_tweets\",\n \"entities\",\n \"public_metrics\",\n \"attachments\",\n ],\n \"user.fields\": [\"id\", \"name\", \"username\", \"profile_image_url\"],\n \"media.fields\": [\"url\", \"preview_image_url\", \"type\"],\n expansions: [\"author_id\", \"attachments.media_keys\", \"referenced_tweets.id\"],\n pagination_token: cursor,\n });\n\n const convertedPosts: Post[] = [];\n\n // Use the paginator's built-in methods to access data\n for await (const post of response) {\n convertedPosts.push(parsePostV2ToV1(post, response.includes));\n if (convertedPosts.length >= maxPosts) break;\n }\n\n return {\n posts: convertedPosts,\n next: response.meta.next_token,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to fetch posts: ${message}`);\n }\n}\n\nexport async function fetchPostsAndReplies(\n userId: string,\n maxPosts: number,\n cursor: string | undefined,\n auth: XAuth\n): Promise<QueryPostsResponse> {\n const client = await auth.getV2Client();\n\n try {\n const response = await client.v2.userTimeline(userId, {\n max_results: Math.min(maxPosts, 100),\n \"tweet.fields\": [\n \"id\",\n \"text\",\n \"created_at\",\n \"author_id\",\n \"referenced_tweets\",\n \"entities\",\n \"public_metrics\",\n \"attachments\",\n ],\n \"user.fields\": [\"id\", \"name\", \"username\", \"profile_image_url\"],\n \"media.fields\": [\"url\", \"preview_image_url\", \"type\"],\n expansions: [\"author_id\", \"attachments.media_keys\", \"referenced_tweets.id\"],\n pagination_token: cursor,\n });\n\n const convertedPosts: Post[] = [];\n\n // Use the paginator's built-in methods to access data\n for await (const post of response) {\n convertedPosts.push(parsePostV2ToV1(post, response.includes));\n if (convertedPosts.length >= maxPosts) break;\n }\n\n return {\n posts: convertedPosts,\n next: response.meta.next_token,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to fetch posts and replies: ${message}`);\n }\n}\n\nexport async function createCreatePostRequestV2(\n text: string,\n auth: XAuth,\n postId?: string,\n options?: {\n poll?: PollData;\n }\n) {\n const v2client = await auth.getV2Client();\n if (v2client == null) {\n throw new Error(\"V2 client is not initialized\");\n }\n const { poll } = options || {};\n let postConfig: {\n text: string;\n poll?: { options: string[]; duration_minutes: number };\n reply?: { in_reply_to_tweet_id: string };\n };\n if (poll) {\n postConfig = {\n text,\n poll: {\n options: poll?.options.map((option) => option.label) ?? [],\n duration_minutes: poll?.duration_minutes ?? 60,\n },\n };\n } else if (postId) {\n postConfig = {\n text,\n reply: {\n in_reply_to_tweet_id: postId,\n },\n };\n } else {\n postConfig = {\n text,\n };\n }\n const postResponse = await v2client.v2.tweet(postConfig);\n let optionsConfig = {};\n if (options?.poll) {\n optionsConfig = {\n expansions: [\"attachments.poll_ids\"],\n pollFields: [\"options\", \"duration_minutes\", \"end_datetime\", \"voting_status\"],\n };\n }\n return await getPostV2(postResponse.data.id, auth, optionsConfig);\n}\n\nexport function parsePostV2ToV1(postV2: PostV2, includes?: ApiV2Includes): Post {\n const parsedPost: Post = {\n id: postV2.id,\n text: postV2.text ?? \"\",\n hashtags: postV2.entities?.hashtags?.map((tag: TweetEntityHashtagV2) => tag.tag) ?? [],\n mentions:\n postV2.entities?.mentions?.map((mention: TweetEntityMentionV2) => ({\n id: mention.id,\n username: mention.username,\n })) ?? [],\n urls: postV2.entities?.urls?.map((url: TweetEntityUrlV2) => url.url) ?? [],\n likes: postV2.public_metrics?.like_count ?? 0,\n reposts: postV2.public_metrics?.retweet_count ?? 0,\n replies: postV2.public_metrics?.reply_count ?? 0,\n quotes: postV2.public_metrics?.quote_count ?? 0,\n views: postV2.public_metrics?.impression_count ?? 0,\n userId: postV2.author_id,\n conversationId: postV2.conversation_id,\n photos: [],\n videos: [],\n poll: null,\n username: \"\",\n name: \"\",\n thread: [],\n timestamp: postV2.created_at ? new Date(postV2.created_at).getTime() / 1000 : Date.now() / 1000,\n permanentUrl: `https://x.com/i/status/${postV2.id}`,\n // Check for referenced posts\n isReply:\n postV2.referenced_tweets?.some((ref: ReferencedTweetV2) => ref.type === \"replied_to\") ??\n false,\n isRepost:\n postV2.referenced_tweets?.some((ref: ReferencedTweetV2) => ref.type === \"retweeted\") ?? false,\n isQuoted:\n postV2.referenced_tweets?.some((ref: ReferencedTweetV2) => ref.type === \"quoted\") ?? false,\n inReplyToStatusId: postV2.referenced_tweets?.find(\n (ref: ReferencedTweetV2) => ref.type === \"replied_to\"\n )?.id,\n quotedStatusId: postV2.referenced_tweets?.find(\n (ref: ReferencedTweetV2) => ref.type === \"quoted\"\n )?.id,\n repostedStatusId: postV2.referenced_tweets?.find(\n (ref: ReferencedTweetV2) => ref.type === \"retweeted\"\n )?.id,\n };\n\n // Process Polls\n if (includes?.polls?.length) {\n const poll = includes.polls[0];\n parsedPost.poll = {\n id: poll.id,\n end_datetime: poll.end_datetime,\n options: poll.options.map((option) => ({\n position: option.position,\n label: option.label,\n votes: option.votes,\n })),\n voting_status: poll.voting_status,\n };\n }\n\n // Process Media (photos and videos)\n if (includes?.media?.length) {\n includes.media.forEach((media: MediaObjectV2) => {\n if (media.type === \"photo\") {\n parsedPost.photos.push({\n id: media.media_key,\n url: media.url ?? \"\",\n alt_text: media.alt_text ?? \"\",\n });\n } else if (media.type === \"video\" || media.type === \"animated_gif\") {\n parsedPost.videos.push({\n id: media.media_key,\n preview: media.preview_image_url ?? \"\",\n url: media.variants?.find((variant) => variant.content_type === \"video/mp4\")?.url ?? \"\",\n });\n }\n });\n }\n\n // Process User (for author info)\n if (includes?.users?.length) {\n const user = includes.users.find((user: UserV2) => user.id === postV2.author_id);\n if (user) {\n parsedPost.username = user.username ?? \"\";\n parsedPost.name = user.name ?? \"\";\n }\n }\n\n // Process Place (if any)\n if (postV2?.geo?.place_id && includes?.places?.length) {\n const place = includes.places.find((place: PlaceV2) => place.id === postV2?.geo?.place_id);\n if (place) {\n parsedPost.place = {\n id: place.id,\n full_name: place.full_name ?? \"\",\n country: place.country ?? \"\",\n country_code: place.country_code ?? \"\",\n name: place.name ?? \"\",\n place_type: place.place_type,\n };\n }\n }\n\n return parsedPost;\n}\n\nexport async function createCreatePostRequest(\n text: string,\n auth: XAuth,\n postId?: string,\n mediaData?: { data: Buffer; mediaType: string }[],\n _hideLinkPreview = false\n) {\n const v2client = await auth.getV2Client();\n if (!v2client) {\n throw new Error(\"V2 client is not initialized\");\n }\n\n try {\n const postConfig: {\n text: string;\n reply?: { in_reply_to_tweet_id: string };\n poll?: { options: string[]; duration_minutes: number };\n } = {\n text,\n };\n\n // Handle media uploads if provided\n if (mediaData && mediaData.length > 0) {\n console.warn(\"Media upload requires X API v1.1 Media Upload endpoint\");\n }\n\n // Handle reply\n if (postId) {\n postConfig.reply = {\n in_reply_to_tweet_id: postId,\n };\n }\n\n const result = await v2client.v2.tweet(postConfig);\n\n return {\n ok: true,\n json: async () => result,\n data: result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to create post: ${message}`);\n }\n}\n\nexport async function createCreateNotePostRequest(\n text: string,\n auth: XAuth,\n postId?: string,\n mediaData?: { data: Buffer; mediaType: string }[]\n) {\n // X API v2 doesn't have a separate endpoint for \"note posts\"\n // Long posts are handled automatically by the v2 post endpoint\n return createCreatePostRequest(text, auth, postId, mediaData);\n}\n\nexport async function fetchListPosts(\n listId: string,\n maxPosts: number,\n cursor: string | undefined,\n auth: XAuth\n): Promise<QueryPostsResponse> {\n const client = await auth.getV2Client();\n\n try {\n const response = await client.v2.listTweets(listId, {\n max_results: Math.min(maxPosts, 100),\n \"tweet.fields\": [\n \"id\",\n \"text\",\n \"created_at\",\n \"author_id\",\n \"referenced_tweets\",\n \"entities\",\n \"public_metrics\",\n \"attachments\",\n ],\n \"user.fields\": [\"id\", \"name\", \"username\", \"profile_image_url\"],\n \"media.fields\": [\"url\", \"preview_image_url\", \"type\"],\n expansions: [\"author_id\", \"attachments.media_keys\", \"referenced_tweets.id\"],\n pagination_token: cursor,\n });\n\n const convertedPosts: Post[] = [];\n\n // Use the paginator's built-in methods to access data\n for await (const post of response) {\n convertedPosts.push(parsePostV2ToV1(post, response.includes));\n if (convertedPosts.length >= maxPosts) break;\n }\n\n return {\n posts: convertedPosts,\n next: response.meta.next_token,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to fetch list posts: ${message}`);\n }\n}\n\nexport async function deletePost(postId: string, auth: XAuth) {\n const v2client = await auth.getV2Client();\n if (!v2client) {\n throw new Error(\"V2 client is not initialized\");\n }\n\n try {\n const result = await v2client.v2.deleteTweet(postId);\n return {\n ok: true,\n success: true,\n json: async () => result,\n data: result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to delete post: ${message}`);\n }\n}\n\nexport async function* getPosts(\n user: string,\n maxPosts: number,\n auth: XAuth\n): AsyncGenerator<Post, void> {\n const userIdRes = await getEntityIdByScreenName(user, auth);\n\n if (!userIdRes.success) {\n throw userIdRes.err;\n }\n\n const { value: userId } = userIdRes;\n\n let cursor: string | undefined;\n let totalFetched = 0;\n\n while (totalFetched < maxPosts) {\n const response = await fetchPosts(userId, maxPosts - totalFetched, cursor, auth);\n\n for (const post of response.posts) {\n yield post;\n totalFetched++;\n if (totalFetched >= maxPosts) break;\n }\n\n cursor = response.next;\n if (!cursor) break;\n }\n}\n\nexport async function* getPostsByUserId(\n userId: string,\n maxPosts: number,\n auth: XAuth\n): AsyncGenerator<Post, void> {\n let cursor: string | undefined;\n let totalFetched = 0;\n\n while (totalFetched < maxPosts) {\n const response = await fetchPosts(userId, maxPosts - totalFetched, cursor, auth);\n\n for (const post of response.posts) {\n yield post;\n totalFetched++;\n if (totalFetched >= maxPosts) break;\n }\n\n cursor = response.next;\n if (!cursor) break;\n }\n}\n\nexport async function* getPostsAndReplies(\n user: string,\n maxPosts: number,\n auth: XAuth\n): AsyncGenerator<Post, void> {\n const userIdRes = await getEntityIdByScreenName(user, auth);\n\n if (!userIdRes.success) {\n throw userIdRes.err;\n }\n\n const { value: userId } = userIdRes;\n\n let cursor: string | undefined;\n let totalFetched = 0;\n\n while (totalFetched < maxPosts) {\n const response = await fetchPostsAndReplies(userId, maxPosts - totalFetched, cursor, auth);\n\n for (const post of response.posts) {\n yield post;\n totalFetched++;\n if (totalFetched >= maxPosts) break;\n }\n\n cursor = response.next;\n if (!cursor) break;\n }\n}\n\nexport async function* getPostsAndRepliesByUserId(\n userId: string,\n maxPosts: number,\n auth: XAuth\n): AsyncGenerator<Post, void> {\n let cursor: string | undefined;\n let totalFetched = 0;\n\n while (totalFetched < maxPosts) {\n const response = await fetchPostsAndReplies(userId, maxPosts - totalFetched, cursor, auth);\n\n for (const post of response.posts) {\n yield post;\n totalFetched++;\n if (totalFetched >= maxPosts) break;\n }\n\n cursor = response.next;\n if (!cursor) break;\n }\n}\n\nexport async function fetchLikedPosts(\n userId: string,\n maxPosts: number,\n cursor: string | undefined,\n auth: XAuth\n): Promise<QueryPostsResponse> {\n const client = await auth.getV2Client();\n\n try {\n const response = await client.v2.userLikedTweets(userId, {\n max_results: Math.min(maxPosts, 100),\n \"tweet.fields\": [\n \"id\",\n \"text\",\n \"created_at\",\n \"author_id\",\n \"referenced_tweets\",\n \"entities\",\n \"public_metrics\",\n \"attachments\",\n ],\n \"user.fields\": [\"id\", \"name\", \"username\", \"profile_image_url\"],\n \"media.fields\": [\"url\", \"preview_image_url\", \"type\"],\n expansions: [\"author_id\", \"attachments.media_keys\", \"referenced_tweets.id\"],\n pagination_token: cursor,\n });\n\n const convertedPosts: Post[] = [];\n\n // Use the paginator's built-in methods to access data\n for await (const post of response) {\n convertedPosts.push(parsePostV2ToV1(post, response.includes));\n if (convertedPosts.length >= maxPosts) break;\n }\n\n return {\n posts: convertedPosts,\n next: response.meta.next_token,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to fetch liked posts: ${message}`);\n }\n}\n\nexport async function getPostWhere(\n posts: AsyncIterable<Post>,\n query: PostQuery\n): Promise<Post | null> {\n const isCallback = typeof query === \"function\";\n\n for await (const post of posts) {\n const matches = isCallback ? await query(post) : checkPostMatches(post, query);\n\n if (matches) {\n return post;\n }\n }\n\n return null;\n}\n\nexport async function getPostsWhere(posts: AsyncIterable<Post>, query: PostQuery): Promise<Post[]> {\n const isCallback = typeof query === \"function\";\n const filtered = [];\n\n for await (const post of posts) {\n const matches = isCallback ? query(post) : checkPostMatches(post, query);\n\n if (!matches) continue;\n filtered.push(post);\n }\n\n return filtered;\n}\n\nfunction checkPostMatches(post: Post, options: Partial<Post>): boolean {\n return Object.keys(options).every((k) => {\n const key = k as keyof Post;\n return post[key] === options[key];\n });\n}\n\nexport async function getLatestPost(\n user: string,\n includeReposts: boolean,\n max: number,\n auth: XAuth\n): Promise<Post | null | undefined> {\n const timeline = getPosts(user, max, auth);\n\n // No point looping if max is 1, just use first entry.\n return max === 1\n ? ((await timeline.next()).value as Post)\n : await getPostWhere(timeline, { isRepost: includeReposts });\n}\n\n// PostResultByRestId interface removed - no longer used with v2 API\n\nexport async function getPost(id: string, auth: XAuth): Promise<Post | null> {\n const client = await auth.getV2Client();\n\n try {\n const post = await client.v2.singleTweet(id, {\n \"tweet.fields\": [\n \"id\",\n \"text\",\n \"created_at\",\n \"author_id\",\n \"referenced_tweets\",\n \"entities\",\n \"public_metrics\",\n \"attachments\",\n \"conversation_id\",\n ],\n \"user.fields\": [\"id\", \"name\", \"username\", \"profile_image_url\"],\n \"media.fields\": [\"url\", \"preview_image_url\", \"type\"],\n \"poll.fields\": [\"id\", \"options\", \"end_datetime\", \"voting_status\"],\n expansions: [\n \"author_id\",\n \"attachments.media_keys\",\n \"attachments.poll_ids\",\n \"referenced_tweets.id\",\n ],\n });\n\n if (!post.data) {\n return null;\n }\n\n return parsePostV2ToV1(post.data, post.includes);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Failed to get post: ${message}`);\n return null;\n }\n}\n\nexport async function getPostV2(\n id: string,\n auth: XAuth,\n options: {\n expansions?: TPostv2Expansion[];\n postFields?: TPostv2PostField[];\n pollFields?: TPostv2PollField[];\n mediaFields?: TPostv2MediaField[];\n userFields?: TPostv2UserField[];\n placeFields?: TPostv2PlaceField[];\n } = defaultOptions\n): Promise<Post | null> {\n const v2client = await auth.getV2Client();\n if (!v2client) {\n throw new Error(\"V2 client is not initialized\");\n }\n\n try {\n const postData = await v2client.v2.singleTweet(id, {\n expansions: options?.expansions,\n \"tweet.fields\": options?.postFields,\n \"poll.fields\": options?.pollFields,\n \"media.fields\": options?.mediaFields,\n \"user.fields\": options?.userFields,\n \"place.fields\": options?.placeFields,\n });\n\n if (!postData?.data) {\n console.warn(`Post data not found for ID: ${id}`);\n return null;\n }\n\n // Extract primary post data\n const parsedPost = parsePostV2ToV1(postData.data, postData?.includes);\n\n return parsedPost;\n } catch (error) {\n console.error(`Error fetching post ${id}:`, error);\n return null;\n }\n}\n\nexport async function getPostsV2(\n ids: string[],\n auth: XAuth,\n options: {\n expansions?: TPostv2Expansion[];\n postFields?: TPostv2PostField[];\n pollFields?: TPostv2PollField[];\n mediaFields?: TPostv2MediaField[];\n userFields?: TPostv2UserField[];\n placeFields?: TPostv2PlaceField[];\n } = defaultOptions\n): Promise<Post[]> {\n const v2client = await auth.getV2Client();\n if (!v2client) {\n return [];\n }\n\n try {\n const postData = await v2client.v2.tweets(ids, {\n expansions: options?.expansions,\n \"tweet.fields\": options?.postFields,\n \"poll.fields\": options?.pollFields,\n \"media.fields\": options?.mediaFields,\n \"user.fields\": options?.userFields,\n \"place.fields\": options?.placeFields,\n });\n const postsV2 = postData.data;\n if (postsV2.length === 0) {\n console.warn(`No post data found for IDs: ${ids.join(\", \")}`);\n return [];\n }\n return (\n await Promise.all(postsV2.map(async (post) => await getPostV2(post.id, auth, options)))\n ).filter((post): post is Post => post !== null);\n } catch (error) {\n console.error(`Error fetching posts for IDs: ${ids.join(\", \")}`, error);\n return [];\n }\n}\n\nexport async function getPostAnonymous(id: string, auth: XAuth): Promise<Post | null> {\n // X API v2 doesn't support anonymous access\n // Use the regular getPost method\n return getPost(id, auth);\n}\n\nasync function _uploadMedia(_mediaData: Buffer, _auth: XAuth, _mediaType: string): Promise<string> {\n // X API v2 media upload is not yet fully implemented in twitter-api-v2 library\n // This would require using the v1.1 media upload endpoint with proper OAuth\n console.warn(\"Media upload not yet implemented for X API v2\");\n throw new Error(\"Media upload not yet implemented for X API v2\");\n}\n\n// Function to create a quote post\nexport async function createQuotePostRequest(\n text: string,\n quotedPostId: string,\n auth: XAuth,\n _mediaData?: { data: Buffer; mediaType: string }[]\n) {\n const v2client = await auth.getV2Client();\n if (!v2client) {\n throw new Error(\"V2 client is not initialized\");\n }\n\n try {\n // Quote posts in v2 are created by including the post URL in the text\n const quotedPostUrl = `https://x.com/i/status/${quotedPostId}`;\n const fullText = `${text} ${quotedPostUrl}`;\n\n const result = await v2client.v2.tweet({\n text: fullText,\n });\n\n return {\n ok: true,\n json: async () => result,\n data: result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to create quote post: ${message}`);\n }\n}\n\n/**\n * Likes a post with the given post ID.\n * @param postId The ID of the post to like.\n * @param auth The authentication object.\n * @returns A promise that resolves when the post is liked.\n */\nexport async function likePost(postId: string, auth: XAuth): Promise<void> {\n const v2client = await auth.getV2Client();\n if (!v2client) {\n throw new Error(\"V2 client is not initialized\");\n }\n\n try {\n await v2client.v2.like(\n (await v2client.v2.me()).data.id, // Current user ID\n postId\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to like post: ${message}`);\n }\n}\n\n/**\n * Reposts a post with the given post ID.\n * @param postId The ID of the post to repost.\n * @param auth The authentication object.\n * @returns A promise that resolves when the post is reposted.\n */\nexport async function repost(postId: string, auth: XAuth): Promise<void> {\n const v2client = await auth.getV2Client();\n if (!v2client) {\n throw new Error(\"V2 client is not initialized\");\n }\n\n try {\n await v2client.v2.retweet(\n (await v2client.v2.me()).data.id, // Current user ID\n postId\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to repost: ${message}`);\n }\n}\n\n/**\n * Unlikes a post with the given post ID.\n * @param postId The ID of the post to unlike.\n * @param auth The authentication object.\n * @returns A promise that resolves when the post is unliked.\n */\nexport async function unlikePost(postId: string, auth: XAuth): Promise<void> {\n const v2client = await auth.getV2Client();\n if (!v2client) {\n throw new Error(\"V2 client is not initialized\");\n }\n\n try {\n await v2client.v2.unlike(\n (await v2client.v2.me()).data.id, // Current user ID\n postId\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to unlike post: ${message}`);\n }\n}\n\n/**\n * Removes a repost of a post with the given post ID.\n * @param postId The ID of the post to unrepost.\n * @param auth The authentication object.\n * @returns A promise that resolves when the repost is removed.\n */\nexport async function unrepost(postId: string, auth: XAuth): Promise<void> {\n const v2client = await auth.getV2Client();\n if (!v2client) {\n throw new Error(\"V2 client is not initialized\");\n }\n\n try {\n await v2client.v2.unretweet(\n (await v2client.v2.me()).data.id, // Current user ID\n postId\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to unrepost: ${message}`);\n }\n}\n\nexport async function createCreateLongPostRequest(\n text: string,\n auth: XAuth,\n postId?: string,\n mediaData?: { data: Buffer; mediaType: string }[]\n) {\n // X API v2 handles long posts automatically\n // Just use the regular post creation endpoint\n return createCreatePostRequest(text, auth, postId, mediaData);\n}\n\n// getArticle function removed - X API v2 doesn't have a separate article endpoint\n\n/**\n * Fetches a single page of reposters for a given post, collecting both bottom and top cursors.\n * Logs each user's description in the process.\n * All comments must remain in English.\n */\nexport async function fetchRepostersPage(\n _postId: string,\n _auth: XAuth,\n _cursor?: string,\n _count = 40\n): Promise<{\n reposters: Reposter[];\n bottomCursor?: string;\n topCursor?: string;\n}> {\n // X API v2 does not provide an endpoint to fetch reposters\n // This functionality would require the API v2 reposted_by endpoint\n console.warn(\"Fetching reposters not implemented for X API v2\");\n return {\n reposters: [],\n bottomCursor: undefined,\n topCursor: undefined,\n };\n}\n\n/**\n * Retrieves *all* reposters by chaining requests until no next cursor is found.\n * @param postId The ID of the post.\n * @param auth The XAuth object for authentication.\n * @returns A list of all users that reposted the post.\n */\nexport async function getAllReposters(postId: string, auth: XAuth): Promise<Reposter[]> {\n let allReposters: Reposter[] = [];\n let cursor: string | undefined;\n\n while (true) {\n // Destructure bottomCursor / topCursor\n const { reposters, bottomCursor, topCursor } = await fetchRepostersPage(\n postId,\n auth,\n cursor,\n 40\n );\n allReposters = allReposters.concat(reposters);\n\n const newCursor = bottomCursor || topCursor;\n\n // Stop if there is no new cursor or if it's the same as the old one\n if (!newCursor || newCursor === cursor) {\n break;\n }\n\n cursor = newCursor;\n }\n\n return allReposters;\n}\n",
101
- "import type { XAuth } from \"./auth\";\nimport type { Profile } from \"./profile\";\nimport type { QueryProfilesResponse } from \"./types\";\n\n/** X API v2 user data shape */\ninterface XV2User {\n id: string;\n username: string;\n name: string;\n profile_image_url?: string;\n description?: string;\n public_metrics?: {\n followers_count?: number;\n following_count?: number;\n tweet_count?: number;\n like_count?: number;\n listed_count?: number;\n };\n protected?: boolean;\n verified?: boolean;\n verified_type?: string;\n location?: string;\n pinned_tweet_id?: string;\n created_at?: string;\n entities?: {\n url?: {\n urls?: Array<{ expanded_url?: string }>;\n };\n };\n}\n\n/**\n * Convert X API v2 user data to Profile format\n */\nfunction parseV2UserToProfile(user: XV2User): Profile {\n return {\n avatar: user.profile_image_url?.replace(\"_normal\", \"\"),\n biography: user.description,\n followersCount: user.public_metrics?.followers_count,\n followingCount: user.public_metrics?.following_count,\n friendsCount: user.public_metrics?.following_count,\n postsCount: user.public_metrics?.tweet_count,\n isPrivate: user.protected ?? false,\n isVerified: user.verified ?? false,\n likesCount: user.public_metrics?.like_count,\n listedCount: user.public_metrics?.listed_count,\n location: user.location || \"\",\n name: user.name,\n pinnedPostIds: user.pinned_tweet_id ? [user.pinned_tweet_id] : [],\n url: `https://x.com/${user.username}`,\n userId: user.id,\n username: user.username,\n isBlueVerified: user.verified_type === \"blue\",\n joined: user.created_at ? new Date(user.created_at) : undefined,\n website: user.entities?.url?.urls?.[0]?.expanded_url,\n };\n}\n\n/**\n * Function to get the following profiles of a user.\n * @param {string} userId - The ID of the user to get the following profiles for.\n * @param {number} maxProfiles - The maximum number of profiles to retrieve.\n * @param {XAuth} auth - The X authentication credentials.\n * @returns {AsyncGenerator<Profile, void>} An async generator that yields Profile objects.\n */\nexport async function* getFollowing(\n userId: string,\n maxProfiles: number,\n auth: XAuth\n): AsyncGenerator<Profile, void> {\n if (!auth) {\n throw new Error(\"Not authenticated\");\n }\n\n const client = await auth.getV2Client();\n let count = 0;\n let paginationToken: string | undefined;\n\n try {\n while (count < maxProfiles) {\n const response = await client.v2.following(userId, {\n max_results: Math.min(maxProfiles - count, 100),\n pagination_token: paginationToken,\n \"user.fields\": [\n \"id\",\n \"name\",\n \"username\",\n \"created_at\",\n \"description\",\n \"entities\",\n \"location\",\n \"pinned_tweet_id\",\n \"profile_image_url\",\n \"protected\",\n \"public_metrics\",\n \"url\",\n \"verified\",\n \"verified_type\",\n ],\n });\n\n if (!response.data || response.data.length === 0) {\n break;\n }\n\n for (const user of response.data) {\n if (count >= maxProfiles) break;\n yield parseV2UserToProfile(user);\n count++;\n }\n\n paginationToken = response.meta?.next_token;\n if (!paginationToken) break;\n }\n } catch (error) {\n console.error(\"Error fetching following:\", error);\n throw error;\n }\n}\n\n/**\n * Get followers for a specific user.\n * @param {string} userId - The user ID for which to retrieve followers.\n * @param {number} maxProfiles - The maximum number of profiles to retrieve.\n * @param {XAuth} auth - The authentication credentials for the X API.\n * @returns {AsyncGenerator<Profile, void>} - An async generator that yields Profile objects representing followers.\n */\nexport async function* getFollowers(\n userId: string,\n maxProfiles: number,\n auth: XAuth\n): AsyncGenerator<Profile, void> {\n if (!auth) {\n throw new Error(\"Not authenticated\");\n }\n\n const client = await auth.getV2Client();\n let count = 0;\n let paginationToken: string | undefined;\n\n try {\n while (count < maxProfiles) {\n const response = await client.v2.followers(userId, {\n max_results: Math.min(maxProfiles - count, 100),\n pagination_token: paginationToken,\n \"user.fields\": [\n \"id\",\n \"name\",\n \"username\",\n \"created_at\",\n \"description\",\n \"entities\",\n \"location\",\n \"pinned_tweet_id\",\n \"profile_image_url\",\n \"protected\",\n \"public_metrics\",\n \"url\",\n \"verified\",\n \"verified_type\",\n ],\n });\n\n if (!response.data || response.data.length === 0) {\n break;\n }\n\n for (const user of response.data) {\n if (count >= maxProfiles) break;\n yield parseV2UserToProfile(user);\n count++;\n }\n\n paginationToken = response.meta?.next_token;\n if (!paginationToken) break;\n }\n } catch (error) {\n console.error(\"Error fetching followers:\", error);\n throw error;\n }\n}\n\n/**\n * Fetches the profiles that a user is following.\n * @param {string} userId - The ID of the user whose following profiles are to be fetched.\n * @param {number} maxProfiles - The maximum number of profiles to fetch.\n * @param {XAuth} auth - The X authentication details.\n * @param {string} [cursor] - Optional cursor for pagination.\n * @returns {Promise<QueryProfilesResponse>} A Promise that resolves with the response containing profiles the user is following.\n */\nexport async function fetchProfileFollowing(\n userId: string,\n maxProfiles: number,\n auth: XAuth,\n cursor?: string\n): Promise<QueryProfilesResponse> {\n if (!auth) {\n throw new Error(\"Not authenticated\");\n }\n\n const client = await auth.getV2Client();\n\n try {\n const response = await client.v2.following(userId, {\n max_results: Math.min(maxProfiles, 100),\n pagination_token: cursor,\n \"user.fields\": [\n \"id\",\n \"name\",\n \"username\",\n \"created_at\",\n \"description\",\n \"entities\",\n \"location\",\n \"pinned_tweet_id\",\n \"profile_image_url\",\n \"protected\",\n \"public_metrics\",\n \"url\",\n \"verified\",\n \"verified_type\",\n ],\n });\n\n const profiles = response.data?.map(parseV2UserToProfile) || [];\n\n return {\n profiles,\n next: response.meta?.next_token,\n };\n } catch (error) {\n console.error(\"Error fetching following profiles:\", error);\n throw error;\n }\n}\n\n/**\n * Fetches the profile followers for a given user ID.\n *\n * @param {string} userId - The user ID for which to fetch profile followers.\n * @param {number} maxProfiles - The maximum number of profiles to fetch.\n * @param {XAuth} auth - The X authentication credentials.\n * @param {string} [cursor] - Optional cursor for paginating results.\n * @returns {Promise<QueryProfilesResponse>} A promise that resolves with the parsed profile followers timeline.\n */\nexport async function fetchProfileFollowers(\n userId: string,\n maxProfiles: number,\n auth: XAuth,\n cursor?: string\n): Promise<QueryProfilesResponse> {\n if (!auth) {\n throw new Error(\"Not authenticated\");\n }\n\n const client = await auth.getV2Client();\n\n try {\n const response = await client.v2.followers(userId, {\n max_results: Math.min(maxProfiles, 100),\n pagination_token: cursor,\n \"user.fields\": [\n \"id\",\n \"name\",\n \"username\",\n \"created_at\",\n \"description\",\n \"entities\",\n \"location\",\n \"pinned_tweet_id\",\n \"profile_image_url\",\n \"protected\",\n \"public_metrics\",\n \"url\",\n \"verified\",\n \"verified_type\",\n ],\n });\n\n const profiles = response.data?.map(parseV2UserToProfile) || [];\n\n return {\n profiles,\n next: response.meta?.next_token,\n };\n } catch (error) {\n console.error(\"Error fetching follower profiles:\", error);\n throw error;\n }\n}\n\n/**\n * Follow a user using X API v2\n *\n * @param {string} username - The username to follow\n * @param {XAuth} auth - The authentication credentials\n * @returns {Promise<Response>} Response from the API\n */\nexport async function followUser(username: string, auth: XAuth): Promise<Response> {\n if (!auth) {\n throw new Error(\"Not authenticated\");\n }\n\n const client = await auth.getV2Client();\n\n try {\n // First get the user ID from username\n const userResponse = await client.v2.userByUsername(username);\n if (!userResponse.data) {\n throw new Error(`User ${username} not found`);\n }\n\n // Get the authenticated user's ID\n const meResponse = await client.v2.me();\n if (!meResponse.data) {\n throw new Error(\"Failed to get authenticated user\");\n }\n\n // Follow the user\n const result = await client.v2.follow(meResponse.data.id, userResponse.data.id);\n\n // Return a Response-like object for compatibility\n return new Response(JSON.stringify(result), {\n status: result.data?.following ? 200 : 400,\n headers: { \"Content-Type\": \"application/json\" },\n });\n } catch (error) {\n console.error(\"Error following user:\", error);\n throw error;\n }\n}\n",
102
- "import type { XAuth } from \"./auth\";\nimport type { Post } from \"./posts\";\nimport type { Profile } from \"./profile\";\n\n/**\n * The categories that can be used in X searches.\n */\n/**\n * Enum representing different search modes.\n * @enum {number}\n */\n\nexport enum SearchMode {\n Top = 0,\n Latest = 1,\n Photos = 2,\n Videos = 3,\n Users = 4,\n}\n\n/**\n * Search for posts using X API v2\n *\n * @param query Search query\n * @param maxPosts Maximum number of posts to return\n * @param searchMode Search mode (not all modes are supported in v2)\n * @param auth Authentication\n * @returns Async generator of posts\n */\nexport async function* searchPosts(\n query: string,\n maxPosts: number,\n searchMode: SearchMode,\n auth: XAuth\n): AsyncGenerator<Post, void> {\n const client = await auth.getV2Client();\n\n // Build query based on search mode\n let finalQuery = query;\n switch (searchMode) {\n case SearchMode.Photos:\n finalQuery = `${query} has:media has:images`;\n break;\n case SearchMode.Videos:\n finalQuery = `${query} has:media has:videos`;\n break;\n }\n\n try {\n const searchIterator = await client.v2.search(finalQuery, {\n max_results: Math.min(maxPosts, 100),\n \"tweet.fields\": [\n \"id\",\n \"text\",\n \"created_at\",\n \"author_id\",\n \"referenced_tweets\",\n \"entities\",\n \"public_metrics\",\n \"attachments\",\n ],\n \"user.fields\": [\"id\", \"name\", \"username\", \"profile_image_url\"],\n \"media.fields\": [\"url\", \"preview_image_url\", \"type\"],\n expansions: [\"author_id\", \"attachments.media_keys\", \"referenced_tweets.id\"],\n });\n\n let count = 0;\n for await (const post of searchIterator) {\n if (count >= maxPosts) break;\n\n // Convert to Post format\n const convertedPost: Post = {\n id: post.id,\n text: post.text || \"\",\n timestamp: post.created_at ? new Date(post.created_at).getTime() : Date.now(),\n timeParsed: post.created_at ? new Date(post.created_at) : new Date(),\n userId: post.author_id || \"\",\n name: searchIterator.includes?.users?.find((u) => u.id === post.author_id)?.name || \"\",\n username:\n searchIterator.includes?.users?.find((u) => u.id === post.author_id)?.username || \"\",\n conversationId: post.id,\n hashtags: post.entities?.hashtags?.map((h) => h.tag) || [],\n mentions:\n post.entities?.mentions?.map((m) => ({\n id: m.id || \"\",\n username: m.username || \"\",\n name: \"\",\n })) || [],\n photos: [],\n thread: [],\n urls: post.entities?.urls?.map((u) => u.expanded_url || u.url) || [],\n videos: [],\n isRepost: post.referenced_tweets?.some((rt) => rt.type === \"retweeted\") || false,\n isReply: post.referenced_tweets?.some((rt) => rt.type === \"replied_to\") || false,\n isQuoted: post.referenced_tweets?.some((rt) => rt.type === \"quoted\") || false,\n isPin: false,\n sensitiveContent: false,\n likes: post.public_metrics?.like_count || undefined,\n replies: post.public_metrics?.reply_count || undefined,\n reposts: post.public_metrics?.retweet_count || undefined,\n views: post.public_metrics?.impression_count || undefined,\n quotes: post.public_metrics?.quote_count || undefined,\n };\n\n yield convertedPost;\n count++;\n }\n } catch (error) {\n console.error(\"Search error:\", error);\n throw error;\n }\n}\n\n/**\n * Search for users using X API v2.\n * User search is limited in standard X API v2 -\n * searches for users mentioned in posts matching the query.\n *\n * @param query Search query\n * @param maxProfiles Maximum number of profiles to return\n * @param auth Authentication\n * @returns Async generator of profiles\n */\nexport async function* searchProfiles(\n query: string,\n maxProfiles: number,\n auth: XAuth\n): AsyncGenerator<Profile, void> {\n const client = await auth.getV2Client();\n const userIds = new Set<string>();\n const profiles: Profile[] = [];\n\n try {\n // Search for posts and extract unique user IDs\n const searchIterator = await client.v2.search(query, {\n max_results: Math.min(maxProfiles * 2, 100), // Get more posts to find more users\n \"tweet.fields\": [\"author_id\"],\n \"user.fields\": [\n \"id\",\n \"name\",\n \"username\",\n \"description\",\n \"profile_image_url\",\n \"public_metrics\",\n \"verified\",\n \"location\",\n \"created_at\",\n ],\n expansions: [\"author_id\"],\n });\n\n for await (const post of searchIterator) {\n if (post.author_id) {\n userIds.add(post.author_id);\n }\n\n // Also get users from includes\n if (searchIterator.includes?.users) {\n for (const user of searchIterator.includes.users) {\n if (profiles.length < maxProfiles && user.id) {\n const profile: Profile = {\n userId: user.id,\n username: user.username || \"\",\n name: user.name || \"\",\n biography: user.description || \"\",\n avatar: user.profile_image_url || \"\",\n followersCount: user.public_metrics?.followers_count,\n followingCount: user.public_metrics?.following_count,\n isVerified: user.verified || false,\n location: user.location || \"\",\n joined: user.created_at ? new Date(user.created_at) : undefined,\n };\n profiles.push(profile);\n }\n }\n }\n\n if (profiles.length >= maxProfiles) break;\n }\n\n // Yield the profiles we found\n for (const profile of profiles) {\n yield profile;\n }\n } catch (error) {\n console.error(\"Profile search error:\", error);\n throw error;\n }\n}\n\n/**\n * Fetch posts quoting a specific post\n *\n * @param quotedPostId The ID of the quoted post\n * @param maxPosts Maximum number of posts to return\n * @param auth Authentication\n * @returns Async generator of posts\n */\nexport async function* searchQuotedPosts(\n quotedPostId: string,\n maxPosts: number,\n auth: XAuth\n): AsyncGenerator<Post, void> {\n // X API v2 doesn't have a direct endpoint for quote posts\n // We need to search for posts that reference this post\n const query = `url:\"x.com/*/status/${quotedPostId}\"`;\n\n yield* searchPosts(query, maxPosts, SearchMode.Latest, auth);\n}\n",
103
- "import type {\n TTweetv2Expansion,\n TTweetv2MediaField,\n TTweetv2PlaceField,\n TTweetv2PollField,\n TTweetv2TweetField,\n TTweetv2UserField,\n} from \"twitter-api-v2\";\n\n// Type aliases for X naming convention\ntype TPostv2Expansion = TTweetv2Expansion;\ntype TPostv2MediaField = TTweetv2MediaField;\ntype TPostv2PlaceField = TTweetv2PlaceField;\ntype TPostv2PollField = TTweetv2PollField;\ntype TPostv2PostField = TTweetv2TweetField;\ntype TPostv2UserField = TTweetv2UserField;\n\nimport type { FetchTransformOptions, RequestApiResult } from \"./api-types\";\nimport { XAuth } from \"./auth\";\nimport type { XAuthProvider, XOAuth1Provider } from \"./auth-providers/types\";\nimport {\n createCreateLongPostRequest,\n createCreateNotePostRequest,\n createCreatePostRequest,\n createCreatePostRequestV2,\n createQuotePostRequest,\n defaultOptions,\n deletePost,\n fetchListPosts,\n getAllReposters,\n getLatestPost,\n getPost,\n getPosts,\n getPostsAndReplies,\n getPostsAndRepliesByUserId,\n getPostsByUserId,\n getPostsV2,\n getPostsWhere,\n getPostV2,\n getPostWhere,\n likePost,\n type PollData,\n type Post,\n type PostQuery,\n parsePostV2ToV1,\n type Reposter,\n repost,\n unlikePost,\n unrepost,\n} from \"./posts\";\n// Removed messages imports - using X API v2 instead\nimport {\n getEntityIdByScreenName,\n getProfile,\n getScreenNameByUserId,\n type Profile,\n} from \"./profile\";\nimport {\n fetchProfileFollowers,\n fetchProfileFollowing,\n followUser,\n getFollowers,\n getFollowing,\n} from \"./relationships\";\nimport { SearchMode, searchPosts, searchProfiles, searchQuotedPosts } from \"./search\";\nimport type { QueryPostsResponse, QueryProfilesResponse } from \"./types\";\n\nconst _xUrl = \"https://x.com\";\n\n/**\n * An alternative fetch function to use instead of the default fetch function. This may be useful\n * in nonstandard runtime environments, such as edge workers.\n *\n * @param {typeof fetch} fetch - The fetch function to use.\n *\n * @param {Partial<FetchTransformOptions>} transform - Additional options that control how requests\n * and responses are processed. This can be used to proxy requests through other hosts, for example.\n */\nexport interface ClientOptions {\n /**\n * An alternative fetch function to use instead of the default fetch function. This may be useful\n * in nonstandard runtime environments, such as edge workers.\n */\n fetch: typeof fetch;\n\n /**\n * Additional options that control how requests and responses are processed. This can be used to\n * proxy requests through other hosts, for example.\n */\n transform: Partial<FetchTransformOptions>;\n}\n\n/**\n * An interface to X's API v2.\n * - Reusing Client objects is recommended to minimize the time spent authenticating unnecessarily.\n */\nexport class Client {\n private auth?: XAuth;\n\n /**\n * Creates a new Client object.\n * - Reusing Client objects is recommended to minimize the time spent authenticating unnecessarily.\n */\n constructor(readonly _options?: Partial<ClientOptions>) {}\n\n /**\n * Fetches an X profile.\n * @param username The X username of the profile to fetch, without an `@` at the beginning.\n * @returns The requested {@link Profile}.\n */\n public async getProfile(username: string): Promise<Profile> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n const res = await getProfile(username, this.auth);\n return this.handleResponse(res);\n }\n\n /**\n * Fetches the user ID corresponding to the provided screen name.\n * @param screenName The X screen name of the profile to fetch.\n * @returns The ID of the corresponding account.\n */\n public async getEntityIdByScreenName(screenName: string): Promise<string> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n const res = await getEntityIdByScreenName(screenName, this.auth);\n return this.handleResponse(res);\n }\n\n /**\n *\n * @param userId The user ID of the profile to fetch.\n * @returns The screen name of the corresponding account.\n */\n public async getScreenNameByUserId(userId: string): Promise<string> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n const response = await getScreenNameByUserId(userId, this.auth);\n return this.handleResponse(response);\n }\n\n /**\n * Fetches posts from X.\n * @param query The search query. Any X-compatible query format can be used.\n * @param maxPosts The maximum number of posts to return.\n * @param includeReplies Whether or not replies should be included in the response.\n * @param searchMode The category filter to apply to the search. Defaults to `Top`.\n * @returns An {@link AsyncGenerator} of posts matching the provided filters.\n */\n public searchPosts(\n query: string,\n maxPosts: number,\n searchMode: SearchMode = SearchMode.Top\n ): AsyncGenerator<Post, void> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return searchPosts(query, maxPosts, searchMode, this.auth);\n }\n\n /**\n * Fetches profiles from X.\n * @param query The search query. Any X-compatible query format can be used.\n * @param maxProfiles The maximum number of profiles to return.\n * @returns An {@link AsyncGenerator} of profiles matching the provided filter(s).\n */\n public searchProfiles(query: string, maxProfiles: number): AsyncGenerator<Profile, void> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return searchProfiles(query, maxProfiles, this.auth);\n }\n\n /**\n * Fetches posts from X.\n * @param query The search query. Any X-compatible query format can be used.\n * @param maxPosts The maximum number of posts to return.\n * @param includeReplies Whether or not replies should be included in the response.\n * @param searchMode The category filter to apply to the search. Defaults to `Top`.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public async fetchSearchPosts(\n query: string,\n maxPosts: number,\n searchMode: SearchMode,\n _cursor?: string\n ): Promise<QueryPostsResponse> {\n // Use the generator and collect results\n const posts: Post[] = [];\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n const generator = searchPosts(query, maxPosts, searchMode, this.auth);\n\n for await (const post of generator) {\n posts.push(post);\n }\n\n return {\n posts,\n // v2 API doesn't provide cursor-based pagination for search\n next: undefined,\n };\n }\n\n /**\n * Fetches profiles from X.\n * @param query The search query. Any X-compatible query format can be used.\n * @param maxProfiles The maximum number of profiles to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public async fetchSearchProfiles(\n query: string,\n maxProfiles: number,\n _cursor?: string\n ): Promise<QueryProfilesResponse> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n // Use the generator and collect results\n const profiles: Profile[] = [];\n const generator = searchProfiles(query, maxProfiles, this.auth);\n\n for await (const profile of generator) {\n profiles.push(profile);\n }\n\n return {\n profiles,\n // v2 API doesn't provide cursor-based pagination for search\n next: undefined,\n };\n }\n\n /**\n * Fetches list posts from X.\n * @param listId The list id\n * @param maxPosts The maximum number of posts to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchListPosts(\n listId: string,\n maxPosts: number,\n cursor?: string\n ): Promise<QueryPostsResponse> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return fetchListPosts(listId, maxPosts, cursor, this.auth);\n }\n\n /**\n * Fetch the profiles a user is following\n * @param userId The user whose following should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @returns An {@link AsyncGenerator} of following profiles for the provided user.\n */\n public getFollowing(userId: string, maxProfiles: number): AsyncGenerator<Profile, void> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return getFollowing(userId, maxProfiles, this.auth);\n }\n\n /**\n * Fetch the profiles that follow a user\n * @param userId The user whose followers should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @returns An {@link AsyncGenerator} of profiles following the provided user.\n */\n public getFollowers(userId: string, maxProfiles: number): AsyncGenerator<Profile, void> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return getFollowers(userId, maxProfiles, this.auth);\n }\n\n /**\n * Fetches following profiles from X.\n * @param userId The user whose following should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchProfileFollowing(\n userId: string,\n maxProfiles: number,\n cursor?: string\n ): Promise<QueryProfilesResponse> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return fetchProfileFollowing(userId, maxProfiles, this.auth, cursor);\n }\n\n /**\n * Fetches profile followers from X.\n * @param userId The user whose following should be returned\n * @param maxProfiles The maximum number of profiles to return.\n * @param cursor The search cursor, which can be passed into further requests for more results.\n * @returns A page of results, containing a cursor that can be used in further requests.\n */\n public fetchProfileFollowers(\n userId: string,\n maxProfiles: number,\n cursor?: string\n ): Promise<QueryProfilesResponse> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return fetchProfileFollowers(userId, maxProfiles, this.auth, cursor);\n }\n\n /**\n * Fetches the home timeline for the current user using X API v2.\n * X API v2 returns a combined feed (no separate \"For You\" vs \"Following\").\n * @param count The number of posts to fetch.\n * @param seenPostIds An array of post IDs that have already been seen (not used in v2).\n * @returns A promise that resolves to an array of posts.\n */\n public async fetchHomeTimeline(count: number, _seenPostIds: string[]): Promise<Post[]> {\n if (!this.auth) {\n throw new Error(\"Not authenticated\");\n }\n\n const client = await this.auth.getV2Client();\n\n try {\n const timeline = await client.v2.homeTimeline({\n max_results: Math.min(count, 100),\n \"tweet.fields\": [\n \"id\",\n \"text\",\n \"created_at\",\n \"author_id\",\n \"referenced_tweets\",\n \"entities\",\n \"public_metrics\",\n \"attachments\",\n \"conversation_id\",\n ],\n \"user.fields\": [\"id\", \"name\", \"username\", \"profile_image_url\"],\n \"media.fields\": [\"url\", \"preview_image_url\", \"type\"],\n expansions: [\"author_id\", \"attachments.media_keys\", \"referenced_tweets.id\"],\n });\n\n const posts: Post[] = [];\n for await (const post of timeline) {\n posts.push(parsePostV2ToV1(post, timeline.includes));\n if (posts.length >= count) break;\n }\n\n return posts;\n } catch (error) {\n console.error(\"Failed to fetch home timeline:\", error);\n throw error;\n }\n }\n\n /**\n * Fetches the home timeline for the current user (same as fetchHomeTimeline in v2).\n * X API v2 doesn't provide separate \"Following\" timeline endpoint.\n * @param count The number of posts to fetch.\n * @param seenPostIds An array of post IDs that have already been seen (not used in v2).\n * @returns A promise that resolves to an array of posts.\n */\n public async fetchFollowingTimeline(count: number, seenPostIds: string[]): Promise<Post[]> {\n // In v2 API, there's no separate following timeline endpoint\n // Use the same home timeline endpoint\n return this.fetchHomeTimeline(count, seenPostIds);\n }\n\n async getUserPosts(\n userId: string,\n maxPosts = 200,\n cursor?: string\n ): Promise<{ posts: Post[]; next?: string }> {\n if (!this.auth) {\n throw new Error(\"Not authenticated\");\n }\n\n const client = await this.auth.getV2Client();\n\n try {\n const response = await client.v2.userTimeline(userId, {\n max_results: Math.min(maxPosts, 100),\n \"tweet.fields\": [\n \"id\",\n \"text\",\n \"created_at\",\n \"author_id\",\n \"referenced_tweets\",\n \"entities\",\n \"public_metrics\",\n \"attachments\",\n \"conversation_id\",\n ],\n \"user.fields\": [\"id\", \"name\", \"username\", \"profile_image_url\"],\n \"media.fields\": [\"url\", \"preview_image_url\", \"type\"],\n expansions: [\"author_id\", \"attachments.media_keys\", \"referenced_tweets.id\"],\n pagination_token: cursor,\n });\n\n const posts: Post[] = [];\n for await (const post of response) {\n posts.push(parsePostV2ToV1(post, response.includes));\n if (posts.length >= maxPosts) break;\n }\n\n return {\n posts,\n next: response.meta?.next_token,\n };\n } catch (error) {\n console.error(\"Failed to fetch user posts:\", error);\n throw error;\n }\n }\n\n async *getUserPostsIterator(userId: string, maxPosts = 200): AsyncGenerator<Post, void> {\n let cursor: string | undefined;\n let retrievedPosts = 0;\n\n while (retrievedPosts < maxPosts) {\n const response = await this.getUserPosts(userId, maxPosts - retrievedPosts, cursor);\n\n for (const post of response.posts) {\n yield post;\n retrievedPosts++;\n if (retrievedPosts >= maxPosts) {\n break;\n }\n }\n\n cursor = response.next;\n\n if (!cursor) {\n break;\n }\n }\n }\n\n /**\n * Fetches the current trends from X.\n * @returns The current list of trends.\n */\n public getTrends(): Promise<string[]> {\n // Trends API not available in X API v2 with current implementation\n console.warn(\"Trends API not available in X API v2\");\n return Promise.resolve([]);\n }\n\n /**\n * Fetches posts from an X user.\n * @param user The user whose posts should be returned.\n * @param maxPosts The maximum number of posts to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of posts from the provided user.\n */\n public getPosts(user: string, maxPosts = 200): AsyncGenerator<Post> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return getPosts(user, maxPosts, this.auth);\n }\n\n /**\n * Fetches posts from an X user using their ID.\n * @param userId The user whose posts should be returned.\n * @param maxPosts The maximum number of posts to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of posts from the provided user.\n */\n public getPostsByUserId(userId: string, maxPosts = 200): AsyncGenerator<Post, void> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return getPostsByUserId(userId, maxPosts, this.auth);\n }\n\n /**\n * Send a post\n * @param text The text of the post\n * @param postId The id of the post to reply to\n * @param mediaData Optional media data\n * @returns\n */\n\n async sendPost(\n text: string,\n replyToPostId?: string,\n mediaData?: { data: Buffer; mediaType: string }[],\n hideLinkPreview?: boolean\n ) {\n if (!text || text.trim().length === 0) {\n throw new Error(\"Text is required\");\n }\n if (text.toLowerCase().startsWith(\"error:\")) {\n throw new Error(`Error sending post: ${text}`);\n }\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return await createCreatePostRequest(\n text,\n this.auth,\n replyToPostId,\n mediaData,\n hideLinkPreview\n );\n }\n\n async sendNotePost(\n text: string,\n replyToPostId?: string,\n mediaData?: { data: Buffer; mediaType: string }[]\n ) {\n if (!text || text.trim().length === 0) {\n throw new Error(\"Text is required\");\n }\n if (text.toLowerCase().startsWith(\"error:\")) {\n throw new Error(`Error sending note post: ${text}`);\n }\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return await createCreateNotePostRequest(text, this.auth, replyToPostId, mediaData);\n }\n\n /**\n * Send a long post (Note Post)\n * @param text The text of the post\n * @param postId The id of the post to reply to\n * @param mediaData Optional media data\n * @returns\n */\n async sendLongPost(\n text: string,\n replyToPostId?: string,\n mediaData?: { data: Buffer; mediaType: string }[]\n ) {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return await createCreateLongPostRequest(text, this.auth, replyToPostId, mediaData);\n }\n\n /**\n * Send a post\n * @param text The text of the post\n * @param postId The id of the post to reply to\n * @param options The options for the post\n * @returns\n */\n\n async sendPostV2(\n text: string,\n replyToPostId?: string,\n options?: {\n poll?: PollData;\n }\n ) {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return await createCreatePostRequestV2(text, this.auth, replyToPostId, options);\n }\n\n /**\n * Fetches posts and replies from an X user.\n * @param user The user whose posts should be returned.\n * @param maxPosts The maximum number of posts to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of posts from the provided user.\n */\n public getPostsAndReplies(user: string, maxPosts = 200): AsyncGenerator<Post> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return getPostsAndReplies(user, maxPosts, this.auth);\n }\n\n /**\n * Fetches posts and replies from an X user using their ID.\n * @param userId The user whose posts should be returned.\n * @param maxPosts The maximum number of posts to return. Defaults to `200`.\n * @returns An {@link AsyncGenerator} of posts from the provided user.\n */\n public getPostsAndRepliesByUserId(userId: string, maxPosts = 200): AsyncGenerator<Post, void> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return getPostsAndRepliesByUserId(userId, maxPosts, this.auth);\n }\n\n /**\n * Fetches the first post matching the given query.\n *\n * Example:\n * ```js\n * const timeline = client.getPosts('user', 200);\n * const repost = await client.getPostWhere(timeline, { isRepost: true });\n * ```\n * @param posts The {@link AsyncIterable} of posts to search through.\n * @param query A query to test **all** posts against. This may be either an\n * object of key/value pairs or a predicate. If this query is an object, all\n * key/value pairs must match a {@link Post} for it to be returned. If this query\n * is a predicate, it must resolve to `true` for a {@link Post} to be returned.\n * - All keys are optional.\n * - If specified, the key must be implemented by that of {@link Post}.\n */\n public getPostWhere(posts: AsyncIterable<Post>, query: PostQuery): Promise<Post | null> {\n return getPostWhere(posts, query);\n }\n\n /**\n * Fetches all posts matching the given query.\n *\n * Example:\n * ```js\n * const timeline = client.getPosts('user', 200);\n * const reposts = await client.getPostsWhere(timeline, { isRepost: true });\n * ```\n * @param posts The {@link AsyncIterable} of posts to search through.\n * @param query A query to test **all** posts against. This may be either an\n * object of key/value pairs or a predicate. If this query is an object, all\n * key/value pairs must match a {@link Post} for it to be returned. If this query\n * is a predicate, it must resolve to `true` for a {@link Post} to be returned.\n * - All keys are optional.\n * - If specified, the key must be implemented by that of {@link Post}.\n */\n public getPostsWhere(posts: AsyncIterable<Post>, query: PostQuery): Promise<Post[]> {\n return getPostsWhere(posts, query);\n }\n\n /**\n * Fetches the most recent post from an X user.\n * @param user The user whose latest post should be returned.\n * @param includeReposts Whether or not to include reposts. Defaults to `false`.\n * @returns The {@link Post} object or `null`/`undefined` if it couldn't be fetched.\n */\n public getLatestPost(\n user: string,\n includeReposts = false,\n max = 200\n ): Promise<Post | null | undefined> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return getLatestPost(user, includeReposts, max, this.auth);\n }\n\n /**\n * Fetches a single post.\n * @param id The ID of the post to fetch.\n * @returns The {@link Post} object, or `null` if it couldn't be fetched.\n */\n public getPost(id: string): Promise<Post | null> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return getPost(id, this.auth);\n }\n\n /**\n * Fetches a single post by ID using the X API v2.\n * Allows specifying optional expansions and fields for more detailed data.\n *\n * @param {string} id - The ID of the post to fetch.\n * @param {Object} [options] - Optional parameters to customize the post data.\n * @param {string[]} [options.expansions] - Array of expansions to include, e.g., 'attachments.poll_ids'.\n * @param {string[]} [options.postFields] - Array of post fields to include, e.g., 'created_at', 'public_metrics'.\n * @param {string[]} [options.pollFields] - Array of poll fields to include, if the post has a poll, e.g., 'options', 'end_datetime'.\n * @param {string[]} [options.mediaFields] - Array of media fields to include, if the post includes media, e.g., 'url', 'preview_image_url'.\n * @param {string[]} [options.userFields] - Array of user fields to include, if user information is requested, e.g., 'username', 'verified'.\n * @param {string[]} [options.placeFields] - Array of place fields to include, if the post includes location data, e.g., 'full_name', 'country'.\n * @returns {Promise<PostV2 | null>} - The post data, including requested expansions and fields.\n */\n async getPostV2(\n id: string,\n options: {\n expansions?: TPostv2Expansion[];\n postFields?: TPostv2PostField[];\n pollFields?: TPostv2PollField[];\n mediaFields?: TPostv2MediaField[];\n userFields?: TPostv2UserField[];\n placeFields?: TPostv2PlaceField[];\n } = defaultOptions\n ): Promise<Post | null> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return await getPostV2(id, this.auth, options);\n }\n\n /**\n * Fetches multiple posts by IDs using the X API v2.\n * Allows specifying optional expansions and fields for more detailed data.\n *\n * @param {string[]} ids - Array of post IDs to fetch.\n * @param {Object} [options] - Optional parameters to customize the post data.\n * @param {string[]} [options.expansions] - Array of expansions to include, e.g., 'attachments.poll_ids'.\n * @param {string[]} [options.postFields] - Array of post fields to include, e.g., 'created_at', 'public_metrics'.\n * @param {string[]} [options.pollFields] - Array of poll fields to include, if posts contain polls, e.g., 'options', 'end_datetime'.\n * @param {string[]} [options.mediaFields] - Array of media fields to include, if posts contain media, e.g., 'url', 'preview_image_url'.\n * @param {string[]} [options.userFields] - Array of user fields to include, if user information is requested, e.g., 'username', 'verified'.\n * @param {string[]} [options.placeFields] - Array of place fields to include, if posts contain location data, e.g., 'full_name', 'country'.\n * @returns {Promise<PostV2[]> } - Array of post data, including requested expansions and fields.\n */\n async getPostsV2(\n ids: string[],\n options: {\n expansions?: TPostv2Expansion[];\n postFields?: TPostv2PostField[];\n pollFields?: TPostv2PollField[];\n mediaFields?: TPostv2MediaField[];\n userFields?: TPostv2UserField[];\n placeFields?: TPostv2PlaceField[];\n } = defaultOptions\n ): Promise<Post[]> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return await getPostsV2(ids, this.auth, options);\n }\n\n /**\n * Updates the authentication state for the client.\n * @param auth The new authentication.\n */\n public updateAuth(auth: XAuth) {\n this.auth = auth;\n }\n\n public async authenticate(provider: XAuthProvider): Promise<void> {\n this.auth = new XAuth(provider);\n // Force initialization early to surface misconfiguration quickly\n await this.auth.isLoggedIn().catch(() => false);\n }\n\n /**\n * Get current authentication credentials\n * @returns {XAuth | null} Current authentication or null if not authenticated\n */\n public getAuth(): XAuth | null {\n return this.auth ?? null;\n }\n\n /**\n * Check if client is properly authenticated with X API v2 credentials\n * @returns {boolean} True if authenticated\n */\n public isAuthenticated(): boolean {\n if (!this.auth) return false;\n return this.auth.hasToken();\n }\n\n /**\n * Returns if the client is logged in as a real user.\n * @returns `true` if the client is logged in with a real user account; otherwise `false`.\n */\n public async isLoggedIn(): Promise<boolean> {\n if (!this.auth) return false;\n return await this.auth.isLoggedIn();\n }\n\n /**\n * Returns the currently logged in user\n * @returns The currently logged in user\n */\n public async me(): Promise<Profile | undefined> {\n if (!this.auth) return undefined;\n return this.auth.me();\n }\n\n /**\n * Login to X using API v2 credentials only.\n * @param appKey The API key\n * @param appSecret The API secret key\n * @param accessToken The access token\n * @param accessSecret The access token secret\n */\n public async login(\n _username: string,\n _password: string,\n _email?: string,\n _twoFactorSecret?: string,\n appKey?: string,\n appSecret?: string,\n accessToken?: string,\n accessSecret?: string\n ): Promise<void> {\n // Only use API credentials for v2 authentication\n if (!appKey || !appSecret || !accessToken || !accessSecret) {\n throw new Error(\"X API v2 credentials are required for authentication\");\n }\n\n // Build a fixed OAuth1 provider inline.\n const oauth1Provider: XOAuth1Provider = {\n mode: \"env\",\n getAccessToken: async () => accessToken,\n getOAuth1Credentials: async () => ({\n appKey: appKey,\n appSecret: appSecret,\n accessToken: accessToken,\n accessSecret: accessSecret,\n }),\n };\n this.auth = new XAuth(oauth1Provider);\n }\n\n /**\n * Log out of X.\n * With API v2 credentials, logout is a no-op.\n */\n public async logout(): Promise<void> {\n // API v2 uses static credentials - nothing to invalidate\n }\n\n /**\n * Sends a quote post.\n * @param text The text of the post.\n * @param quotedPostId The ID of the post to quote.\n * @param options Optional parameters, such as media data.\n * @returns The response from the X API.\n */\n public async sendQuotePost(\n text: string,\n quotedPostId: string,\n options?: {\n mediaData: { data: Buffer; mediaType: string }[];\n }\n ) {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return await createQuotePostRequest(text, quotedPostId, this.auth, options?.mediaData);\n }\n\n /**\n * Delete a post with the given ID.\n * @param postId The ID of the post to delete.\n * @returns A promise that resolves when the post is deleted.\n */\n public async deletePost(postId: string): Promise<{ success: boolean }> {\n // Call the deletePost function from posts.ts\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n const result = await deletePost(postId, this.auth);\n return { success: result.ok };\n }\n\n /**\n * Likes a post with the given post ID.\n * @param postId The ID of the post to like.\n * @returns A promise that resolves when the post is liked.\n */\n public async likePost(postId: string): Promise<void> {\n // Call the likePost function from posts.ts\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n await likePost(postId, this.auth);\n }\n\n /**\n * Reposts a post with the given post ID.\n * @param postId The ID of the post to repost.\n * @returns A promise that resolves when the post is reposted.\n */\n public async repost(postId: string): Promise<void> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n await repost(postId, this.auth);\n }\n\n /**\n * Unlikes a post with the given post ID.\n * @param postId The ID of the post to unlike.\n * @returns A promise that resolves when the post is unliked.\n */\n public async unlikePost(postId: string): Promise<void> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n await unlikePost(postId, this.auth);\n }\n\n /**\n * Removes a repost of a post with the given post ID.\n * @param postId The ID of the post to unrepost.\n * @returns A promise that resolves when the repost is removed.\n */\n public async unrepost(postId: string): Promise<void> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n await unrepost(postId, this.auth);\n }\n\n /**\n * Follows a user with the given user ID.\n * @param userId The user ID of the user to follow.\n * @returns A promise that resolves when the user is followed.\n */\n public async followUser(userName: string): Promise<void> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n // Call the followUser function from relationships.ts\n await followUser(userName, this.auth);\n }\n\n /**\n * Fetches direct message conversations.\n * Requires additional API permissions not included in basic access.\n */\n public async getDirectMessageConversations(\n _userId: string,\n _cursor?: string\n ): Promise<{ conversations: unknown[] }> {\n throw new Error(\"DM access requires elevated API permissions\");\n }\n\n /**\n * Sends a direct message to a user.\n * Requires additional API permissions not included in basic access.\n */\n public async sendDirectMessage(_conversationId: string, _text: string): Promise<never> {\n throw new Error(\"DM access requires elevated API permissions\");\n }\n\n private handleResponse<T>(res: RequestApiResult<T>): T {\n if (!res.success) {\n throw res.err;\n }\n\n return res.value;\n }\n\n /**\n * Retrieves all users who reposted the given post.\n * @param postId The ID of the post.\n * @returns An array of users (reposters).\n */\n public async getRepostersOfPost(postId: string): Promise<Reposter[]> {\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n return await getAllReposters(postId, this.auth);\n }\n\n /**\n * Fetches all quote posts for a given post ID, handling pagination automatically.\n * @param postId The ID of the post to fetch quotes for.\n * @param maxQuotes Maximum number of quotes to return (default: 100).\n * @returns An array of all quote posts.\n */\n public async fetchAllQuotedPosts(postId: string, maxQuotes: number = 100): Promise<Post[]> {\n const allQuotes: Post[] = [];\n\n try {\n let cursor: string | undefined;\n let totalFetched = 0;\n\n while (totalFetched < maxQuotes) {\n const batchSize = Math.min(40, maxQuotes - totalFetched);\n const page = await this.fetchQuotedPostsPage(postId, batchSize, cursor);\n\n if (!page.posts || page.posts.length === 0) {\n break;\n }\n\n allQuotes.push(...page.posts);\n totalFetched += page.posts.length;\n\n // Check if there's a next page\n if (!page.next) {\n break;\n }\n\n cursor = page.next;\n }\n\n return allQuotes.slice(0, maxQuotes);\n } catch (error) {\n console.error(\"Error fetching quoted posts:\", error);\n throw error;\n }\n }\n\n /**\n * Fetches quote posts for a given post ID.\n * This method now uses a generator function internally.\n * @param postId The ID of the post to fetch quotes for.\n * @param maxQuotes Maximum number of quotes to return.\n * @param cursor Optional cursor for pagination.\n * @returns A promise that resolves to a QueryPostsResponse containing posts and the next cursor.\n */\n public async fetchQuotedPostsPage(\n postId: string,\n maxQuotes: number = 40,\n _cursor?: string\n ): Promise<QueryPostsResponse> {\n // Collect quotes from the generator\n const quotes: Post[] = [];\n let count = 0;\n\n // searchQuotedPosts doesn't support cursor, so we'll collect all quotes up to maxQuotes\n if (!this.auth) {\n throw new Error(\"X auth not initialized\");\n }\n for await (const quote of searchQuotedPosts(postId, maxQuotes, this.auth)) {\n quotes.push(quote);\n count++;\n if (count >= maxQuotes) break;\n }\n\n return {\n posts: quotes,\n next: undefined, // X API v2 doesn't provide cursor for quote search\n };\n }\n}\n",
104
- "import {\n ChannelType,\n createUniqueUuid,\n type IAgentRuntime,\n logger,\n type Memory,\n type UUID,\n} from \"@elizaos/core\";\n\n// WorldOwnership type for world metadata\ntype WorldOwnership = { ownerId: string };\n\nimport type { Post as ClientPost } from \"../client\";\n\nexport interface XContextOptions {\n post?: ClientPost;\n userId: string;\n username: string;\n name?: string;\n conversationId?: string;\n}\n\nexport interface XContextResult {\n worldId: UUID;\n roomId: UUID;\n entityId: UUID;\n}\n\nexport async function ensureXContext(\n runtime: IAgentRuntime,\n options: XContextOptions\n): Promise<XContextResult> {\n const { userId, username, name = username, conversationId = userId } = options;\n\n const worldId = createUniqueUuid(runtime, userId);\n const roomId = createUniqueUuid(runtime, conversationId);\n const entityId = createUniqueUuid(runtime, userId);\n\n try {\n await runtime.ensureWorldExists({\n id: worldId,\n name: `${username}'s X`,\n agentId: runtime.agentId,\n messageServerId: createUniqueUuid(runtime, `server-${userId}`),\n metadata: {\n ownership: { ownerId: userId } as unknown as WorldOwnership,\n extra: {\n x: {\n username: username,\n id: userId,\n },\n },\n },\n });\n\n await runtime.ensureRoomExists({\n id: roomId,\n name: `X conversation ${conversationId}`,\n source: \"x\",\n type: ChannelType.FEED,\n channelId: conversationId,\n messageServerId: createUniqueUuid(runtime, `server-${userId}`),\n worldId: worldId,\n });\n\n await runtime.ensureConnection({\n entityId,\n roomId,\n userName: username,\n name: name,\n source: \"x\",\n type: ChannelType.FEED,\n worldId: worldId,\n });\n\n return {\n worldId,\n roomId,\n entityId,\n };\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(\"Failed to ensure X context:\", err.message);\n throw new Error(`Failed to create X context for user ${username}: ${err.message}`);\n }\n}\n\nexport async function createMemorySafe(\n runtime: IAgentRuntime,\n memory: Memory,\n tableName: string = \"messages\",\n maxRetries: number = 3\n): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n await runtime.createMemory(memory, tableName);\n return;\n } catch (error: unknown) {\n lastError = error instanceof Error ? error : new Error(String(error));\n logger.warn(\n `Failed to create memory (attempt ${attempt + 1}/${maxRetries}):`,\n lastError.message\n );\n\n if (lastError.message?.includes(\"duplicate\") || lastError.message?.includes(\"constraint\")) {\n logger.debug(\"Memory already exists, skipping\");\n return;\n }\n\n if (attempt < maxRetries - 1) {\n await new Promise((resolve) => setTimeout(resolve, 2 ** attempt * 1000));\n }\n }\n }\n\n logger.error(\n { error: lastError?.message },\n `Failed to create memory after ${maxRetries} attempts`\n );\n throw lastError;\n}\n\nexport async function isPostProcessed(runtime: IAgentRuntime, postId: string): Promise<boolean> {\n try {\n const memoryId = createUniqueUuid(runtime, postId);\n const memory = await runtime.getMemoryById(memoryId);\n return !!memory;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.debug(`Error checking if post ${postId} is processed:`, err.message);\n return false;\n }\n}\n\nexport async function getRecentPosts(\n runtime: IAgentRuntime,\n username: string,\n _count: number = 10\n): Promise<string[]> {\n try {\n const cacheKey = `x/${username}/recentPosts`;\n const cached = await runtime.getCache<string[]>(cacheKey);\n\n if (cached && Array.isArray(cached)) {\n return cached;\n }\n\n return [];\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.debug(\"Error getting recent posts from cache:\", err.message);\n return [];\n }\n}\n\nexport async function addToRecentPosts(\n runtime: IAgentRuntime,\n username: string,\n postText: string,\n maxRecent: number = 10\n): Promise<void> {\n try {\n const cacheKey = `x/${username}/recentPosts`;\n const recent = await getRecentPosts(runtime, username, maxRecent);\n\n recent.unshift(postText);\n const trimmed = recent.slice(0, maxRecent);\n\n await runtime.setCache(cacheKey, trimmed);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.debug(\"Error updating recent posts cache:\", err.message);\n }\n}\n\nexport async function isDuplicatePost(\n runtime: IAgentRuntime,\n username: string,\n postText: string,\n _similarityThreshold: number = 0.9\n): Promise<boolean> {\n try {\n const recentPosts = await getRecentPosts(runtime, username);\n\n if (recentPosts.includes(postText)) {\n return true;\n }\n\n const normalizedNew = postText.toLowerCase().trim();\n for (const recent of recentPosts) {\n const normalizedRecent = recent.toLowerCase().trim();\n\n if (normalizedNew === normalizedRecent) {\n return true;\n }\n\n if (normalizedNew.includes(normalizedRecent) || normalizedRecent.includes(normalizedNew)) {\n return true;\n }\n }\n\n return false;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.debug(\"Error checking for duplicate posts:\", err.message);\n return false;\n }\n}\n",
105
- "export function getEpochMs(ts: number | undefined): number {\n if (!ts) return Date.now();\n const digits = Math.floor(Math.log10(ts)) + 1;\n\n if (digits <= 12) {\n return ts * 1000;\n }\n\n if (digits === 13) {\n return ts;\n }\n\n if (digits === 16) {\n return Math.floor(ts / 1000);\n }\n\n while (ts > 9_999_999_999_999) {\n ts = Math.floor(ts / 1000);\n }\n return ts;\n}\n",
106
- "import {\n createUniqueUuid,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n} from \"@elizaos/core\";\nimport type { ClientBase } from \"./base\";\nimport type { Client, Post } from \"./client/index\";\nimport { SearchMode } from \"./client/index\";\nimport { getRandomInterval } from \"./environment\";\nimport { createMemorySafe, ensureXContext } from \"./utils/memory\";\nimport { getSetting } from \"./utils/settings\";\n\ninterface DiscoveryConfig {\n // Topics from character configuration\n topics: string[];\n // Minimum follower count for accounts to consider\n minFollowerCount: number;\n // Maximum accounts to follow per cycle\n maxFollowsPerCycle: number;\n // Maximum engagements per cycle\n maxEngagementsPerCycle: number;\n // Engagement probability thresholds\n likeThreshold: number;\n replyThreshold: number;\n quoteThreshold: number;\n}\n\ninterface ScoredPost {\n post: Post;\n relevanceScore: number;\n engagementType: \"like\" | \"reply\" | \"quote\" | \"skip\";\n}\n\ninterface ScoredAccount {\n user: {\n id: string;\n username: string;\n name: string;\n followersCount: number;\n };\n qualityScore: number;\n relevanceScore: number;\n}\n\nexport class XDiscoveryClient {\n private xClient: Client;\n private runtime: IAgentRuntime;\n private config: DiscoveryConfig;\n private isRunning: boolean = false;\n private isDryRun: boolean;\n\n constructor(client: ClientBase, runtime: IAgentRuntime, state: Record<string, unknown>) {\n this.xClient = client.xClient;\n this.runtime = runtime;\n\n // Check dry run mode\n const dryRunSetting =\n state?.X_DRY_RUN ?? getSetting(this.runtime, \"X_DRY_RUN\") ?? process.env.X_DRY_RUN;\n this.isDryRun =\n dryRunSetting === true ||\n dryRunSetting === \"true\" ||\n (typeof dryRunSetting === \"string\" && dryRunSetting.toLowerCase() === \"true\");\n\n // Build config from character settings\n this.config = this.buildDiscoveryConfig();\n\n logger.info(\n `X Discovery Config: topics=${this.config.topics.join(\", \")}, isDryRun=${this.isDryRun}, minFollowerCount=${this.config.minFollowerCount}, maxFollowsPerCycle=${this.config.maxFollowsPerCycle}, maxEngagementsPerCycle=${this.config.maxEngagementsPerCycle}`\n );\n }\n\n /**\n * Sanitizes a topic for use in X search queries\n * - Removes common stop words that might be interpreted as operators\n * - Handles special characters\n * - Simplifies complex phrases\n */\n private sanitizeTopic(topic: string): string {\n // Remove common conjunctions that might be interpreted as operators\n let sanitized = topic\n .replace(/\\band\\b/gi, \" \")\n .replace(/\\bor\\b/gi, \" \")\n .replace(/\\bnot\\b/gi, \" \")\n .trim();\n\n // Remove extra spaces\n sanitized = sanitized.replace(/\\s+/g, \" \");\n\n // If the topic is still multi-word, wrap in quotes\n return sanitized.includes(\" \") ? `\"${sanitized}\"` : sanitized;\n }\n\n private buildDiscoveryConfig(): DiscoveryConfig {\n const character = this.runtime?.character;\n\n // Default topics if character is not available\n const defaultTopics = [\n \"ai\",\n \"technology\",\n \"blockchain\",\n \"web3\",\n \"crypto\",\n \"programming\",\n \"innovation\",\n ];\n\n // Use character topics, extract from bio, or use defaults\n let topics: string[] = defaultTopics;\n\n if (character) {\n if (character.topics && Array.isArray(character.topics) && character.topics.length > 0) {\n topics = character.topics;\n } else if (character.bio) {\n topics = this.extractTopicsFromBio(character.bio);\n }\n } else {\n logger.warn(\"Character not available in runtime, using default topics for discovery\");\n }\n\n return {\n topics,\n minFollowerCount: parseInt(\n (getSetting(this.runtime, \"X_MIN_FOLLOWER_COUNT\") as string) ||\n process.env.X_MIN_FOLLOWER_COUNT ||\n \"100\",\n 10\n ),\n maxFollowsPerCycle: parseInt(\n (getSetting(this.runtime, \"X_MAX_FOLLOWS_PER_CYCLE\") as string) ||\n process.env.X_MAX_FOLLOWS_PER_CYCLE ||\n \"5\",\n 10\n ),\n maxEngagementsPerCycle: parseInt(\n (getSetting(this.runtime, \"X_MAX_ENGAGEMENTS_PER_RUN\") as string) ||\n process.env.X_MAX_ENGAGEMENTS_PER_RUN ||\n \"5\",\n 10\n ),\n likeThreshold: 0.5, // Increased from 0.3 (be more selective)\n replyThreshold: 0.7, // Increased from 0.5 (be more selective)\n quoteThreshold: 0.85, // Increased from 0.7 (be more selective)\n };\n }\n\n private extractTopicsFromBio(bio: string | string[] | undefined): string[] {\n if (!bio) {\n return [];\n }\n\n const bioText = Array.isArray(bio) ? bio.join(\" \") : bio;\n // Extract meaningful words as potential topics\n const words = bioText\n .toLowerCase()\n .split(/\\s+/)\n .filter((word) => word.length > 4)\n .filter(\n (word) => ![\"about\", \"helping\", \"working\", \"people\", \"making\", \"building\"].includes(word)\n );\n return [...new Set(words)].slice(0, 5); // Limit to 5 topics\n }\n\n async start() {\n logger.info(\"Starting X Discovery Client...\");\n this.isRunning = true;\n\n const discoveryLoop = async () => {\n if (!this.isRunning) {\n logger.info(\"Discovery client stopped, exiting loop\");\n return;\n }\n\n try {\n await this.runDiscoveryCycle();\n } catch (error: unknown) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"Discovery cycle error:\", errorMsg);\n }\n\n // Run discovery every 20-40 minutes (with variance)\n const discoveryIntervalMinutes = getRandomInterval(this.runtime, \"discovery\");\n const nextInterval = discoveryIntervalMinutes * 60 * 1000;\n\n logger.log(`Next discovery cycle in ${discoveryIntervalMinutes.toFixed(1)} minutes`);\n\n // Schedule next discovery\n setTimeout(discoveryLoop, nextInterval);\n };\n\n // Start after a short delay\n setTimeout(discoveryLoop, 5000);\n }\n\n async stop() {\n logger.info(\"Stopping X Discovery Client...\");\n this.isRunning = false;\n }\n\n private async runDiscoveryCycle() {\n logger.info(\"Starting X discovery cycle...\");\n\n const discoveries = await this.discoverContent();\n const { posts, accounts } = discoveries;\n\n logger.info(`Discovered ${posts.length} posts and ${accounts.length} accounts`);\n\n // Process discovered accounts (follow high-quality ones)\n const followedCount = await this.processAccounts(accounts);\n\n // Process discovered posts (engage with relevant ones)\n const engagementCount = await this.processPosts(posts);\n\n logger.info(\n `Discovery cycle complete: ${followedCount} follows, ${engagementCount} engagements`\n );\n }\n\n private async discoverContent(): Promise<{\n posts: ScoredPost[];\n accounts: ScoredAccount[];\n }> {\n const allPosts: ScoredPost[] = [];\n const allAccounts = new Map<string, ScoredAccount>();\n\n // X API v2 doesn't support trends - using topic-based discovery only\n\n // 1. Discover from topic searches (primary discovery method)\n try {\n const topicContent = await this.discoverFromTopics();\n allPosts.push(...topicContent.posts);\n for (const acc of topicContent.accounts) {\n allAccounts.set(acc.user.id, acc);\n }\n } catch (error: unknown) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"Failed to discover from topics:\", errorMsg);\n }\n\n // 2. Discover from conversation threads\n try {\n const threadContent = await this.discoverFromThreads();\n allPosts.push(...threadContent.posts);\n for (const acc of threadContent.accounts) {\n allAccounts.set(acc.user.id, acc);\n }\n } catch (error: unknown) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"Failed to discover from threads:\", errorMsg);\n }\n\n // 3. Discover from popular accounts in our topics\n try {\n const popularContent = await this.discoverFromPopularAccounts();\n allPosts.push(...popularContent.posts);\n for (const acc of popularContent.accounts) {\n allAccounts.set(acc.user.id, acc);\n }\n } catch (error) {\n logger.error(\n \"Failed to discover from popular accounts:\",\n error instanceof Error ? error.message : String(error)\n );\n }\n\n // Sort by relevance score\n const sortedPosts = allPosts.sort((a, b) => b.relevanceScore - a.relevanceScore).slice(0, 50); // Top 50 posts\n\n const sortedAccounts = Array.from(allAccounts.values())\n .sort((a, b) => b.qualityScore * b.relevanceScore - a.qualityScore * a.relevanceScore)\n .slice(0, 20); // Top 20 accounts\n\n return { posts: sortedPosts, accounts: sortedAccounts };\n }\n\n private async discoverFromTopics(): Promise<{\n posts: ScoredPost[];\n accounts: ScoredAccount[];\n }> {\n logger.debug(\"Discovering from character topics...\");\n\n const posts: ScoredPost[] = [];\n const accounts = new Map<string, ScoredAccount>();\n\n // Search for each topic with different query strategies\n for (const topic of this.config.topics.slice(0, 5)) {\n try {\n // Sanitize topic for search query\n const searchTopic = this.sanitizeTopic(topic);\n\n // Strategy 1: Popular posts in topic (min_faves filter applied post-retrieval)\n const popularQuery = `${searchTopic} -is:repost -is:reply lang:en`;\n\n logger.debug(`Searching popular posts for topic: ${topic}`);\n const popularResults = await this.xClient.fetchSearchPosts(\n popularQuery,\n 20,\n SearchMode.Top\n );\n\n for (const post of popularResults.posts) {\n // Filter by engagement after retrieval\n if ((post.likes || 0) < 10) continue;\n\n const scored = this.scorePost(post, \"topic\");\n posts.push(scored);\n\n // Extract account info from popular post authors\n if (!post.userId || !post.username) {\n continue;\n }\n const authorUsername = post.username;\n const authorName = post.name || post.username;\n\n // Estimate follower count based on post engagement\n // Popular posts often come from accounts with decent followings\n const estimatedFollowers = Math.max(\n 1000, // minimum estimate\n (post.likes || 0) * 100 // rough estimate: 100 followers per like\n );\n\n const account = this.scoreAccount({\n id: post.userId,\n username: authorUsername,\n name: authorName,\n followersCount: estimatedFollowers,\n });\n\n if (account.qualityScore > 0.3) {\n // Lower threshold to discover more accounts\n accounts.set(post.userId, account);\n }\n }\n\n // Strategy 2: Latest posts with good engagement (not just verified)\n const engagedQuery = `${searchTopic} -is:repost lang:en`;\n\n logger.debug(`Searching engaged posts for topic: ${topic}`);\n const engagedResults = await this.xClient.fetchSearchPosts(\n engagedQuery,\n 15,\n SearchMode.Latest\n );\n\n for (const post of engagedResults.posts) {\n // Only include posts with some engagement\n if ((post.likes || 0) < 5) continue;\n\n const scored = this.scorePost(post, \"topic\");\n posts.push(scored);\n\n // Extract account info from post author\n if (!post.userId || !post.username) {\n continue;\n }\n const authorUsername = post.username;\n const authorName = post.name || post.username;\n\n // Estimate follower count based on engagement\n const estimatedFollowers = Math.max(\n 500, // minimum for engaged posts\n (post.likes || 0) * 50\n );\n\n const account = this.scoreAccount({\n id: post.userId,\n username: authorUsername,\n name: authorName,\n followersCount: estimatedFollowers,\n });\n\n if (account.qualityScore > 0.2) {\n // Even lower threshold for engaged content\n accounts.set(post.userId, account);\n }\n }\n } catch (error) {\n logger.error(\n `Failed to search topic ${topic}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n return { posts, accounts: Array.from(accounts.values()) };\n }\n\n private async discoverFromThreads(): Promise<{\n posts: ScoredPost[];\n accounts: ScoredAccount[];\n }> {\n logger.debug(\"Discovering from conversation threads...\");\n\n const posts: ScoredPost[] = [];\n const accounts = new Map<string, ScoredAccount>();\n\n // Search for viral conversations in our topics\n // X API v2 doesn't support min_replies/min_faves - filter by engagement in scoring\n const topicQuery = this.config.topics\n .slice(0, 3)\n .map((t) => this.sanitizeTopic(t))\n .join(\" OR \");\n\n try {\n // Search for conversations (posts with engagement)\n const viralQuery = `(${topicQuery}) -is:repost has:mentions`;\n\n logger.debug(`Searching viral threads with query: ${viralQuery}`);\n const searchResults = await this.xClient.fetchSearchPosts(viralQuery, 15, SearchMode.Top);\n\n for (const post of searchResults.posts) {\n // Filter for posts with good engagement (proxy for viral threads)\n const engagementScore = (post.likes || 0) + (post.reposts || 0) * 2;\n if (engagementScore < 10) continue; // Lowered from 50 - more inclusive\n\n const scored = this.scorePost(post, \"thread\");\n posts.push(scored);\n\n // Viral thread authors are likely high-quality accounts\n if (!post.userId || !post.username) {\n continue;\n }\n const account = this.scoreAccount({\n id: post.userId,\n username: post.username,\n name: post.name || post.username,\n followersCount: 1000, // Reasonable estimate for engaged users\n });\n\n if (account.qualityScore > 0.5) {\n // Lowered from 0.6\n accounts.set(post.userId, account);\n }\n }\n } catch (error) {\n logger.error(\n \"Failed to discover threads:\",\n error instanceof Error ? error.message : String(error)\n );\n }\n\n return { posts, accounts: Array.from(accounts.values()) };\n }\n\n private async discoverFromPopularAccounts(): Promise<{\n posts: ScoredPost[];\n accounts: ScoredAccount[];\n }> {\n logger.debug(\"Discovering from popular accounts in topics...\");\n\n const posts: ScoredPost[] = [];\n const accounts = new Map<string, ScoredAccount>();\n\n // Search for users who frequently post about our topics\n for (const topic of this.config.topics.slice(0, 3)) {\n try {\n // Sanitize topic for search query\n const searchTopic = this.sanitizeTopic(topic);\n\n // Find posts from accounts with high engagement\n // X API v2 doesn't support min_faves/min_reposts - filter post-retrieval\n const influencerQuery = `${searchTopic} -is:repost lang:en`;\n\n logger.debug(`Searching for influencers in topic: ${topic}`);\n const results = await this.xClient.fetchSearchPosts(influencerQuery, 10, SearchMode.Top);\n\n for (const post of results.posts) {\n // Filter by engagement metrics after retrieval\n const engagement = (post.likes || 0) + (post.reposts || 0) * 2;\n if (engagement < 5) continue; // Lowered from 20 - more inclusive\n\n const scored = this.scorePost(post, \"topic\");\n posts.push(scored);\n\n // High engagement suggests a quality account\n const estimatedFollowers = Math.max(\n (post.likes || 0) * 100,\n (post.reposts || 0) * 200,\n 10000\n );\n\n if (!post.userId || !post.username) {\n continue;\n }\n const account = this.scoreAccount({\n id: post.userId,\n username: post.username,\n name: post.name || post.username,\n followersCount: estimatedFollowers,\n });\n\n if (account.qualityScore > 0.7) {\n accounts.set(post.userId, account);\n }\n }\n } catch (error) {\n logger.error(\n `Failed to discover popular accounts for ${topic}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n return { posts, accounts: Array.from(accounts.values()) };\n }\n\n // Remove the discoverFromTrends method since API v2 doesn't support it\n // Remove the isTrendRelevant method since we're not using trends\n\n private scorePost(post: Post, source: string): ScoredPost {\n // Skip reposts - we want original content\n if (post.isRepost) {\n return {\n post,\n relevanceScore: 0,\n engagementType: \"skip\",\n };\n }\n\n let relevanceScore = 0;\n\n // Base score by source\n const sourceScores: Record<string, number> = {\n topic: 0.4,\n thread: 0.35,\n };\n relevanceScore += sourceScores[source] || 0;\n\n // Score by engagement metrics - much more realistic thresholds\n const engagementScore = Math.min(\n (post.likes || 0) / 100 + // 100 likes = 0.1 points (was 1000)\n (post.reposts || 0) / 50 + // 50 reposts = 0.1 points (was 500)\n (post.replies || 0) / 20, // 20 replies = 0.1 points (was 100)\n 0.3\n );\n relevanceScore += engagementScore;\n\n // Score by text relevance if text exists\n if (post.text) {\n // Additional scoring based on text content can go here\n }\n\n // Score by content relevance to topics\n if (post.text) {\n const textLower = post.text.toLowerCase();\n const topicMatches = this.config.topics.filter((topic) =>\n textLower.includes(topic.toLowerCase())\n ).length;\n relevanceScore += Math.min(topicMatches * 0.15, 0.3); // Increased from 0.1\n }\n\n // Bonus for verified accounts (isBlueVerified may not be in all responses)\n\n // Normalize score\n relevanceScore = Math.min(relevanceScore, 1);\n\n // Determine engagement type based on score\n let engagementType: ScoredPost[\"engagementType\"] = \"skip\";\n if (relevanceScore >= this.config.quoteThreshold) {\n engagementType = \"quote\";\n } else if (relevanceScore >= this.config.replyThreshold) {\n engagementType = \"reply\";\n } else if (relevanceScore >= this.config.likeThreshold) {\n engagementType = \"like\";\n }\n\n return {\n post,\n relevanceScore,\n engagementType,\n };\n }\n\n private scoreAccount(user: ScoredAccount[\"user\"]): ScoredAccount {\n let qualityScore = 0;\n let relevanceScore = 0;\n\n // Quality based on follower count\n if (user.followersCount > 10000) qualityScore += 0.4;\n else if (user.followersCount > 1000) qualityScore += 0.3;\n else if (user.followersCount > 100) qualityScore += 0.2;\n\n // Relevance based on username/name matching topics\n const userText = `${user.username} ${user.name}`.toLowerCase();\n const topicMatches = this.config.topics.filter((topic) =>\n userText.includes(topic.toLowerCase())\n ).length;\n relevanceScore = Math.min(topicMatches * 0.3, 1);\n\n return {\n user,\n qualityScore: Math.min(qualityScore, 1),\n relevanceScore,\n };\n }\n\n private async processAccounts(accounts: ScoredAccount[]): Promise<number> {\n let followedCount = 0;\n\n // Sort accounts by combined quality and relevance score\n const sortedAccounts = accounts.sort((a, b) => {\n const scoreA = a.qualityScore + a.relevanceScore;\n const scoreB = b.qualityScore + b.relevanceScore;\n return scoreB - scoreA;\n });\n\n for (const scoredAccount of sortedAccounts) {\n if (followedCount >= this.config.maxFollowsPerCycle) break;\n\n // Skip accounts with too few followers\n if (scoredAccount.user.followersCount < this.config.minFollowerCount) {\n logger.debug(\n `Skipping @${scoredAccount.user.username} - below minimum follower count (${scoredAccount.user.followersCount} < ${this.config.minFollowerCount})`\n );\n continue;\n }\n\n // Skip low-quality accounts\n if (scoredAccount.qualityScore < 0.2) {\n logger.debug(\n `Skipping @${scoredAccount.user.username} - quality score too low (${scoredAccount.qualityScore.toFixed(2)})`\n );\n continue;\n }\n\n try {\n // Check if already following (via memory)\n const isFollowing = await this.checkIfFollowing(scoredAccount.user.id);\n if (isFollowing) continue;\n\n if (this.isDryRun) {\n logger.info(\n `[DRY RUN] Would follow @${scoredAccount.user.username} ` +\n `(quality: ${scoredAccount.qualityScore.toFixed(2)}, ` +\n `relevance: ${scoredAccount.relevanceScore.toFixed(2)})`\n );\n } else {\n // Follow the account\n await this.xClient.followUser(scoredAccount.user.id);\n\n logger.info(\n `Followed @${scoredAccount.user.username} ` +\n `(quality: ${scoredAccount.qualityScore.toFixed(2)}, ` +\n `relevance: ${scoredAccount.relevanceScore.toFixed(2)})`\n );\n\n // Save follow action to memory\n await this.saveFollowMemory(scoredAccount.user);\n }\n\n followedCount++;\n\n // Add a delay to avoid rate limits\n await this.delay(2000 + Math.random() * 3000);\n } catch (error) {\n logger.error(\n `Failed to follow @${scoredAccount.user.username}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n return followedCount;\n }\n\n private async processPosts(posts: ScoredPost[]): Promise<number> {\n let engagementCount = 0;\n\n for (const scoredPost of posts) {\n if (engagementCount >= this.config.maxEngagementsPerCycle) break;\n if (scoredPost.engagementType === \"skip\") continue;\n\n try {\n // Check if already engaged\n if (!scoredPost.post.id) {\n continue;\n }\n const postMemoryId = createUniqueUuid(this.runtime, scoredPost.post.id);\n const existingMemory = await this.runtime.getMemoryById(postMemoryId);\n if (existingMemory) {\n logger.debug(`Already engaged with post ${scoredPost.post.id}, skipping`);\n continue;\n }\n\n // Perform engagement\n switch (scoredPost.engagementType) {\n case \"like\":\n if (this.isDryRun) {\n logger.info(\n `[DRY RUN] Would like post: ${scoredPost.post.id} (score: ${scoredPost.relevanceScore.toFixed(2)})`\n );\n } else {\n if (!scoredPost.post.id) {\n continue;\n }\n await this.xClient.likePost(scoredPost.post.id);\n logger.info(\n `Liked post: ${scoredPost.post.id} (score: ${scoredPost.relevanceScore.toFixed(2)})`\n );\n }\n break;\n\n case \"reply\": {\n const replyText = await this.generateReply(scoredPost.post);\n if (this.isDryRun) {\n logger.info(\n `[DRY RUN] Would reply to post ${scoredPost.post.id} with: \"${replyText}\"`\n );\n } else {\n await this.xClient.sendPost(replyText, scoredPost.post.id);\n logger.info(`Replied to post: ${scoredPost.post.id}`);\n }\n break;\n }\n\n case \"quote\": {\n if (!scoredPost.post.id) {\n continue;\n }\n const quoteText = await this.generateQuote(scoredPost.post);\n if (this.isDryRun) {\n logger.info(`[DRY RUN] Would quote post ${scoredPost.post.id} with: \"${quoteText}\"`);\n } else {\n await this.xClient.sendQuotePost(quoteText, scoredPost.post.id);\n logger.info(`Quoted post: ${scoredPost.post.id}`);\n }\n break;\n }\n }\n\n // Save engagement to memory (even in dry run for tracking)\n await this.saveEngagementMemory(scoredPost.post, scoredPost.engagementType);\n\n engagementCount++;\n\n // Add delay to avoid rate limits\n await this.delay(3000 + Math.random() * 5000);\n } catch (error: unknown) {\n // Check if it's a 403 error\n const errorMessage = (error as { message?: string })?.message;\n if (errorMessage?.includes(\"403\")) {\n logger.warn(\n `Permission denied (403) for post ${scoredPost.post.id}. ` +\n `This might be a protected account or restricted post. Skipping.`\n );\n // Still save to memory to avoid retrying\n await this.saveEngagementMemory(scoredPost.post, \"skip\");\n } else if (errorMessage?.includes(\"429\")) {\n logger.warn(\n `Rate limit (429) hit while engaging with post ${scoredPost.post.id}. ` +\n `Pausing engagement cycle.`\n );\n // Break out of the loop on rate limit\n break;\n } else {\n logger.error(\n `Failed to engage with post ${scoredPost.post.id}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n }\n\n return engagementCount;\n }\n\n private async checkIfFollowing(userId: string): Promise<boolean> {\n // Check our memory to see if we've followed them\n const embedding = await this.runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: `followed X user ${userId}`,\n });\n\n const followMemories = await this.runtime.searchMemories({\n tableName: \"messages\",\n embedding,\n match_threshold: 0.8,\n count: 1,\n });\n return followMemories.length > 0;\n }\n\n private async generateReply(post: Post): Promise<string> {\n // Handle case where runtime.character might be undefined\n const characterName = this.runtime?.character?.name || \"AI Assistant\";\n let characterBio = \"\";\n\n if (this.runtime?.character?.bio) {\n if (Array.isArray(this.runtime.character.bio)) {\n characterBio = this.runtime.character.bio.join(\" \");\n } else {\n characterBio = this.runtime.character.bio;\n }\n }\n\n const prompt = `You are ${characterName}. Generate a thoughtful reply to this post:\n\nPost by @${post.username || \"unknown\"}: \"${post.text || \"\"}\"\n\nYour interests: ${this.config.topics.join(\", \")}\nCharacter bio: ${characterBio}\n\nKeep the reply:\n- Relevant and adding value to the conversation\n- Under 280 characters\n- Natural and conversational\n- Related to your expertise and interests\n- Respectful and constructive\n\nReply:`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n maxTokens: 100,\n temperature: 0.8,\n });\n\n return response.trim();\n }\n\n private async generateQuote(post: Post): Promise<string> {\n // Handle case where runtime.character might be undefined\n const characterName = this.runtime?.character?.name || \"AI Assistant\";\n let characterBio = \"\";\n\n if (this.runtime?.character?.bio) {\n if (Array.isArray(this.runtime.character.bio)) {\n characterBio = this.runtime.character.bio.join(\" \");\n } else {\n characterBio = this.runtime.character.bio;\n }\n }\n\n const prompt = `You are ${characterName}. Add your perspective to this post with a quote post:\n\nOriginal post by @${post.username || \"unknown\"}: \"${post.text || \"\"}\"\n\nYour interests: ${this.config.topics.join(\", \")}\nCharacter bio: ${characterBio}\n\nCreate a quote post that:\n- Adds unique insight or perspective\n- Is under 280 characters\n- Respectfully builds on the original idea\n- Showcases your expertise\n- Encourages further discussion\n\nQuote post:`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n maxTokens: 100,\n temperature: 0.8,\n });\n\n return response.trim();\n }\n\n private async saveEngagementMemory(post: Post, engagementType: string) {\n try {\n // Ensure context exists before saving memory\n if (!post.userId || !post.username) {\n logger.warn(\"Cannot ensure context: missing userId or username\");\n return;\n }\n const context = await ensureXContext(this.runtime, {\n userId: post.userId,\n username: post.username,\n conversationId: post.conversationId || post.id || \"\",\n });\n\n const memory: Memory = {\n id: createUniqueUuid(this.runtime, `${post.id}-${engagementType}`),\n entityId: context.entityId,\n content: {\n text: `${engagementType} post from @${post.username}: ${post.text}`,\n metadata: {\n postId: post.id,\n engagementType,\n source: \"discovery\",\n isDryRun: this.isDryRun,\n },\n },\n roomId: context.roomId,\n agentId: this.runtime.agentId,\n createdAt: Date.now(),\n };\n\n await createMemorySafe(this.runtime, memory, \"messages\");\n logger.debug(`[Discovery] Saved ${engagementType} memory for post ${post.id}`);\n } catch (error) {\n logger.error(\n `[Discovery] Failed to save engagement memory:`,\n error instanceof Error ? error.message : String(error)\n );\n // Don't throw - just log the error\n }\n }\n\n private async saveFollowMemory(user: ScoredAccount[\"user\"]) {\n try {\n // Create a simple context for follows\n const context = await ensureXContext(this.runtime, {\n userId: user.id,\n username: user.username,\n name: user.name,\n conversationId: `x-follows`,\n });\n\n const memory: Memory = {\n id: createUniqueUuid(this.runtime, `follow-${user.id}`),\n entityId: context.entityId,\n content: {\n text: `followed X user ${user.id} @${user.username}`,\n metadata: {\n userId: user.id,\n username: user.username,\n name: user.name,\n followersCount: user.followersCount,\n source: \"discovery\",\n isDryRun: this.isDryRun,\n },\n },\n roomId: context.roomId,\n agentId: this.runtime.agentId,\n createdAt: Date.now(),\n };\n\n await createMemorySafe(this.runtime, memory, \"messages\");\n logger.debug(`[Discovery] Saved follow memory for @${user.username}`);\n } catch (error) {\n logger.error(\n `[Discovery] Failed to save follow memory:`,\n error instanceof Error ? error.message : String(error)\n );\n // Don't throw - just log the error\n }\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n",
107
- "import type { IAgentRuntime } from \"@elizaos/core\";\nimport { z } from \"zod\";\nimport { getSetting } from \"./utils/settings\";\n\nfunction getXSetting(runtime: IAgentRuntime, key: string): string {\n return getSetting(runtime, key) || \"\";\n}\n\nexport const xEnvSchema = z.object({\n X_AUTH_MODE: z.enum([\"env\", \"oauth\", \"bearer\"]).default(\"env\"),\n X_API_KEY: z.string().default(\"\"),\n X_API_SECRET: z.string().default(\"\"),\n X_ACCESS_TOKEN: z.string().default(\"\"),\n X_ACCESS_TOKEN_SECRET: z.string().default(\"\"),\n X_BEARER_TOKEN: z.string().default(\"\"),\n X_CLIENT_ID: z.string().default(\"\"),\n X_REDIRECT_URI: z.string().default(\"\"),\n X_DRY_RUN: z.string().default(\"false\"),\n X_TARGET_USERS: z.string().default(\"\"),\n X_ENABLE_POST: z.string().default(\"false\"),\n X_ENABLE_REPLIES: z.string().default(\"true\"),\n X_ENABLE_ACTIONS: z.string().default(\"false\"),\n X_ENABLE_DISCOVERY: z.string().default(\"false\"),\n X_POST_INTERVAL_MIN: z.string().default(\"90\"),\n X_POST_INTERVAL_MAX: z.string().default(\"180\"),\n X_ENGAGEMENT_INTERVAL_MIN: z.string().default(\"20\"),\n X_ENGAGEMENT_INTERVAL_MAX: z.string().default(\"40\"),\n X_DISCOVERY_INTERVAL_MIN: z.string().default(\"15\"),\n X_DISCOVERY_INTERVAL_MAX: z.string().default(\"30\"),\n X_MAX_ENGAGEMENTS_PER_RUN: z.string().default(\"5\"),\n X_MAX_POST_LENGTH: z.string().default(\"280\"),\n X_RETRY_LIMIT: z.string().default(\"5\"),\n});\n\nexport type TwitterConfig = z.infer<typeof xEnvSchema>;\n\nfunction parseTargetUsers(str: string): string[] {\n if (!str.trim()) return [];\n return str\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\nexport function shouldTargetUser(username: string, targetConfig: string): boolean {\n if (!targetConfig.trim()) return true;\n const targets = parseTargetUsers(targetConfig);\n if (targets.includes(\"*\")) return true;\n const normalized = username.toLowerCase().replace(/^@/, \"\");\n return targets.some((t) => t.toLowerCase().replace(/^@/, \"\") === normalized);\n}\n\nexport function getTargetUsers(targetConfig: string): string[] {\n return parseTargetUsers(targetConfig).filter((u) => u !== \"*\");\n}\n\nexport async function validateXConfig(runtime: IAgentRuntime): Promise<TwitterConfig> {\n const mode = (getXSetting(runtime, \"X_AUTH_MODE\") || \"env\").toLowerCase();\n\n const config: TwitterConfig = {\n X_AUTH_MODE: mode as \"env\" | \"oauth\" | \"bearer\",\n X_API_KEY: getXSetting(runtime, \"X_API_KEY\"),\n X_API_SECRET: getXSetting(runtime, \"X_API_SECRET\") || getXSetting(runtime, \"X_API_SECRET_KEY\"),\n X_ACCESS_TOKEN: getXSetting(runtime, \"X_ACCESS_TOKEN\"),\n X_ACCESS_TOKEN_SECRET: getXSetting(runtime, \"X_ACCESS_TOKEN_SECRET\"),\n X_BEARER_TOKEN: getXSetting(runtime, \"X_BEARER_TOKEN\"),\n X_CLIENT_ID: getXSetting(runtime, \"X_CLIENT_ID\"),\n X_REDIRECT_URI: getXSetting(runtime, \"X_REDIRECT_URI\"),\n X_DRY_RUN: getXSetting(runtime, \"X_DRY_RUN\") || \"false\",\n X_TARGET_USERS: getXSetting(runtime, \"X_TARGET_USERS\"),\n X_ENABLE_POST: getXSetting(runtime, \"X_ENABLE_POST\") || \"false\",\n X_ENABLE_REPLIES: getXSetting(runtime, \"X_ENABLE_REPLIES\") || \"true\",\n X_ENABLE_ACTIONS: getXSetting(runtime, \"X_ENABLE_ACTIONS\") || \"false\",\n X_ENABLE_DISCOVERY: getXSetting(runtime, \"X_ENABLE_DISCOVERY\") || \"false\",\n X_POST_INTERVAL_MIN: getXSetting(runtime, \"X_POST_INTERVAL_MIN\") || \"90\",\n X_POST_INTERVAL_MAX: getXSetting(runtime, \"X_POST_INTERVAL_MAX\") || \"180\",\n X_ENGAGEMENT_INTERVAL_MIN: getXSetting(runtime, \"X_ENGAGEMENT_INTERVAL_MIN\") || \"20\",\n X_ENGAGEMENT_INTERVAL_MAX: getXSetting(runtime, \"X_ENGAGEMENT_INTERVAL_MAX\") || \"40\",\n X_DISCOVERY_INTERVAL_MIN: getXSetting(runtime, \"X_DISCOVERY_INTERVAL_MIN\") || \"15\",\n X_DISCOVERY_INTERVAL_MAX: getXSetting(runtime, \"X_DISCOVERY_INTERVAL_MAX\") || \"30\",\n X_MAX_ENGAGEMENTS_PER_RUN: getXSetting(runtime, \"X_MAX_ENGAGEMENTS_PER_RUN\") || \"5\",\n X_MAX_POST_LENGTH: getXSetting(runtime, \"X_MAX_POST_LENGTH\") || \"280\",\n X_RETRY_LIMIT: getXSetting(runtime, \"X_RETRY_LIMIT\") || \"5\",\n };\n\n if (mode === \"env\") {\n if (\n !config.X_API_KEY ||\n !config.X_API_SECRET ||\n !config.X_ACCESS_TOKEN ||\n !config.X_ACCESS_TOKEN_SECRET\n ) {\n throw new Error(\n \"X env auth requires X_API_KEY, X_API_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET\"\n );\n }\n } else if (mode === \"bearer\") {\n if (!config.X_BEARER_TOKEN) {\n throw new Error(\"X bearer auth requires X_BEARER_TOKEN\");\n }\n } else if (mode === \"oauth\") {\n if (!config.X_CLIENT_ID || !config.X_REDIRECT_URI) {\n throw new Error(\"X OAuth requires X_CLIENT_ID and X_REDIRECT_URI\");\n }\n }\n\n return xEnvSchema.parse(config);\n}\n\nfunction parseInterval(value: string, fallback: number): number {\n const parsed = parseInt(value, 10);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\nexport function getRandomInterval(\n runtime: IAgentRuntime,\n type: \"post\" | \"engagement\" | \"discovery\"\n): number {\n const intervals = {\n post: {\n min: \"X_POST_INTERVAL_MIN\",\n max: \"X_POST_INTERVAL_MAX\",\n defMin: 90,\n defMax: 180,\n },\n engagement: {\n min: \"X_ENGAGEMENT_INTERVAL_MIN\",\n max: \"X_ENGAGEMENT_INTERVAL_MAX\",\n defMin: 20,\n defMax: 40,\n },\n discovery: {\n min: \"X_DISCOVERY_INTERVAL_MIN\",\n max: \"X_DISCOVERY_INTERVAL_MAX\",\n defMin: 15,\n defMax: 30,\n },\n };\n\n const { min, max, defMin, defMax } = intervals[type];\n const minVal = parseInterval(getXSetting(runtime, min), defMin);\n const maxVal = parseInterval(getXSetting(runtime, max), defMax);\n\n return minVal < maxVal ? Math.random() * (maxVal - minVal) + minVal : defMin;\n}\n\nexport function loadConfig(): TwitterConfig {\n const get = (key: string): string => process.env[key] || \"\";\n return {\n X_AUTH_MODE: (get(\"X_AUTH_MODE\") || \"env\") as \"env\" | \"oauth\" | \"bearer\",\n X_API_KEY: get(\"X_API_KEY\"),\n X_API_SECRET: get(\"X_API_SECRET\"),\n X_ACCESS_TOKEN: get(\"X_ACCESS_TOKEN\"),\n X_ACCESS_TOKEN_SECRET: get(\"X_ACCESS_TOKEN_SECRET\"),\n X_BEARER_TOKEN: get(\"X_BEARER_TOKEN\"),\n X_CLIENT_ID: get(\"X_CLIENT_ID\"),\n X_REDIRECT_URI: get(\"X_REDIRECT_URI\"),\n X_DRY_RUN: get(\"X_DRY_RUN\") || \"false\",\n X_TARGET_USERS: get(\"X_TARGET_USERS\"),\n X_ENABLE_POST: get(\"X_ENABLE_POST\") || \"false\",\n X_ENABLE_REPLIES: get(\"X_ENABLE_REPLIES\") || \"true\",\n X_ENABLE_ACTIONS: get(\"X_ENABLE_ACTIONS\") || \"false\",\n X_ENABLE_DISCOVERY: get(\"X_ENABLE_DISCOVERY\") || \"false\",\n X_POST_INTERVAL_MIN: get(\"X_POST_INTERVAL_MIN\") || \"90\",\n X_POST_INTERVAL_MAX: get(\"X_POST_INTERVAL_MAX\") || \"180\",\n X_ENGAGEMENT_INTERVAL_MIN: get(\"X_ENGAGEMENT_INTERVAL_MIN\") || \"20\",\n X_ENGAGEMENT_INTERVAL_MAX: get(\"X_ENGAGEMENT_INTERVAL_MAX\") || \"40\",\n X_DISCOVERY_INTERVAL_MIN: get(\"X_DISCOVERY_INTERVAL_MIN\") || \"15\",\n X_DISCOVERY_INTERVAL_MAX: get(\"X_DISCOVERY_INTERVAL_MAX\") || \"30\",\n X_MAX_ENGAGEMENTS_PER_RUN: get(\"X_MAX_ENGAGEMENTS_PER_RUN\") || \"5\",\n X_MAX_POST_LENGTH: get(\"X_MAX_POST_LENGTH\") || \"280\",\n X_RETRY_LIMIT: get(\"X_RETRY_LIMIT\") || \"5\",\n };\n}\n\nexport function validateConfig(config: unknown): TwitterConfig {\n return xEnvSchema.parse(config);\n}\n\nexport function loadConfigFromFile(): Partial<TwitterConfig> {\n return {};\n}\n",
108
- "import {\n ChannelType,\n type Content,\n type ContentValue,\n createUniqueUuid,\n EventType,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n type MemoryMetadata,\n MemoryType,\n type MessagePayload,\n ModelType,\n} from \"@elizaos/core\";\n\n// WorldOwnership type for world metadata\ntype WorldOwnership = { ownerId: string };\n\nimport type { ClientBase } from \"./base\";\nimport { SearchMode } from \"./client/index\";\nimport type { Post as ClientPost } from \"./client/posts\";\nimport { getRandomInterval, getTargetUsers, shouldTargetUser } from \"./environment\";\n/**\n * Template for generating dialog and actions for a X message handler.\n *\n * @type {string}\n */\n/**\n * Templates for XAI plugin interactions.\n * Auto-generated from prompts/*.txt\n * DO NOT EDIT - Generated from ./generated/prompts/typescript/prompts.ts\n */\nimport {\n messageHandlerTemplate,\n xMessageHandlerTemplate,\n} from \"./generated/prompts/typescript/prompts.js\";\nimport type {\n XInteractionMemory,\n XInteractionPayload,\n XLikeReceivedPayload,\n XMemory,\n XQuoteReceivedPayload,\n XRepostReceivedPayload,\n} from \"./types\";\nimport { XEventTypes } from \"./types\";\nimport { sendPost } from \"./utils\";\nimport { createMemorySafe, ensureXContext as ensureContext, isPostProcessed } from \"./utils/memory\";\nimport { getSetting } from \"./utils/settings\";\nimport { getEpochMs } from \"./utils/time\";\nexport { xMessageHandlerTemplate, messageHandlerTemplate };\n\n/**\n * The XInteractionClient class manages X interactions,\n * including handling mentions, managing timelines, and engaging with other users.\n * It extends the base X client functionality to provide mention handling,\n * user interaction, and follow change detection capabilities.\n *\n * @extends ClientBase\n */\nexport class XInteractionClient {\n client: ClientBase;\n runtime: IAgentRuntime;\n xUsername: string;\n xUserId: string;\n private isDryRun: boolean;\n private state: Record<string, unknown>;\n private isRunning: boolean = false;\n\n /**\n * Constructor to initialize the X interaction client with runtime and state management.\n *\n * @param {ClientBase} client - The client instance.\n * @param {IAgentRuntime} runtime - The runtime instance for agent operations.\n * @param {Record<string, unknown>} state - The state object containing configuration settings.\n */\n constructor(client: ClientBase, runtime: IAgentRuntime, state: Record<string, unknown>) {\n this.client = client;\n this.runtime = runtime;\n this.state = state;\n\n const dryRunSetting =\n this.state?.X_DRY_RUN ?? getSetting(this.runtime, \"X_DRY_RUN\") ?? process.env.X_DRY_RUN;\n this.isDryRun =\n dryRunSetting === true ||\n dryRunSetting === \"true\" ||\n (typeof dryRunSetting === \"string\" && dryRunSetting.toLowerCase() === \"true\");\n\n // Initialize X username and user ID from client profile\n const usernameSetting = getSetting(this.runtime, \"X_USERNAME\") || this.state?.X_USERNAME;\n this.xUsername =\n typeof usernameSetting === \"string\" ? usernameSetting : client.profile?.username || \"\";\n this.xUserId = client.profile?.id || \"\";\n }\n\n /**\n * Asynchronously starts the process of handling X interactions on a loop.\n * Uses the X_ENGAGEMENT_INTERVAL setting.\n */\n async start() {\n this.isRunning = true;\n\n const handleXInteractionsLoop = () => {\n if (!this.isRunning) {\n logger.info(\"X interaction client stopped, exiting loop\");\n return;\n }\n\n // Get random engagement interval in minutes\n const engagementIntervalMinutes = getRandomInterval(this.runtime, \"engagement\");\n\n const interactionInterval = engagementIntervalMinutes * 60 * 1000;\n\n logger.info(\n `X interaction client will check in ${engagementIntervalMinutes.toFixed(1)} minutes`\n );\n\n this.handleXInteractions();\n\n if (this.isRunning) {\n setTimeout(handleXInteractionsLoop, interactionInterval);\n }\n };\n handleXInteractionsLoop();\n }\n\n /**\n * Stops the X interaction client\n */\n async stop() {\n logger.log(\"Stopping X interaction client...\");\n this.isRunning = false;\n }\n\n /**\n * Asynchronously handles X interactions by checking for mentions and target user posts.\n */\n async handleXInteractions() {\n logger.log(\"Checking X interactions\");\n\n const xUsername = this.client.profile?.username;\n\n try {\n // Check for mentions first (replies enabled by default)\n const repliesEnabled =\n (getSetting(this.runtime, \"X_ENABLE_REPLIES\") ?? process.env.X_ENABLE_REPLIES) !== \"false\";\n\n if (repliesEnabled && xUsername) {\n await this.handleMentions(xUsername);\n }\n\n // Check target users' posts for autonomous engagement\n const targetUsersConfig =\n ((getSetting(this.runtime, \"X_TARGET_USERS\") ?? process.env.X_TARGET_USERS) as string) ||\n \"\";\n\n if (targetUsersConfig?.trim()) {\n await this.handleTargetUserPosts(targetUsersConfig);\n }\n\n // Save the latest checked post ID to the file\n await this.client.cacheLatestCheckedPostId();\n\n logger.log(\"Finished checking X interactions\");\n } catch (error) {\n logger.error(\n \"Error handling X interactions:\",\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n /**\n * Handle mentions and replies\n */\n private async handleMentions(xUsername: string) {\n try {\n // Check for mentions\n const cursorKey = `x/${xUsername}/mention_cursor`;\n const cachedCursor: string | undefined = await this.runtime.getCache<string>(cursorKey);\n\n const searchResult = await this.client.fetchSearchPosts(\n `@${xUsername}`,\n 20,\n SearchMode.Latest,\n cachedCursor ?? undefined\n );\n\n const mentionCandidates = searchResult.posts;\n\n // If we got posts and there's a valid cursor, cache it\n if (mentionCandidates.length > 0 && searchResult.previous) {\n await this.runtime.setCache(cursorKey, searchResult.previous);\n } else if (!searchResult.previous && !searchResult.next) {\n // If both previous and next are missing, clear the outdated cursor\n await this.runtime.setCache(cursorKey, \"\");\n }\n\n await this.processMentionPosts(mentionCandidates);\n } catch (error) {\n logger.error(\n \"Error handling mentions:\",\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n /**\n * Handle autonomous engagement with target users' posts\n */\n private async handleTargetUserPosts(targetUsersConfig: string) {\n try {\n const targetUsers = getTargetUsers(targetUsersConfig);\n\n if (targetUsers.length === 0 && !targetUsersConfig.includes(\"*\")) {\n return; // No target users configured\n }\n\n logger.info(`Checking posts from target users: ${targetUsers.join(\", \") || \"everyone (*)\"}`);\n\n // For each target user, search their recent posts\n for (const targetUser of targetUsers) {\n try {\n const normalizedUsername = targetUser.replace(/^@/, \"\");\n\n // Search for recent posts from this user\n const searchQuery = `from:${normalizedUsername} -is:reply -is:repost`;\n const searchResult = await this.client.fetchSearchPosts(\n searchQuery,\n 10, // Get up to 10 recent posts per user\n SearchMode.Latest\n );\n\n if (searchResult.posts.length > 0) {\n logger.info(`Found ${searchResult.posts.length} posts from @${normalizedUsername}`);\n\n // Process these posts for potential engagement\n await this.processTargetUserPosts(searchResult.posts, normalizedUsername);\n }\n } catch (error) {\n logger.error(\n `Error searching posts from @${targetUser}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n // If wildcard is configured, also check timeline for any interesting posts\n if (targetUsersConfig.includes(\"*\")) {\n await this.processTimelineForEngagement();\n }\n } catch (error) {\n logger.error(\n \"Error handling target user posts:\",\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n /**\n * Process posts from target users for potential engagement\n */\n private async processTargetUserPosts(posts: ClientPost[], username: string) {\n const maxEngagementsPerRun = parseInt(\n (getSetting(this.runtime, \"X_MAX_ENGAGEMENTS_PER_RUN\") as string) ||\n process.env.X_MAX_ENGAGEMENTS_PER_RUN ||\n \"10\",\n 10\n );\n\n let engagementCount = 0;\n\n for (const post of posts) {\n if (engagementCount >= maxEngagementsPerRun) {\n logger.info(`Reached max engagements limit (${maxEngagementsPerRun})`);\n break;\n }\n\n // Skip if already processed\n if (!post.id) {\n continue;\n }\n const isProcessed = await isPostProcessed(this.runtime, post.id);\n if (isProcessed) {\n continue; // Already processed\n }\n\n // Skip if post is too old (older than 24 hours)\n const postAge = Date.now() - getEpochMs(post.timestamp);\n const maxAge = 24 * 60 * 60 * 1000; // 24 hours\n\n if (postAge > maxAge) {\n continue;\n }\n\n // Decide whether to engage with this post\n const shouldEngage = await this.shouldEngageWithPost(post);\n\n if (shouldEngage) {\n logger.info(\n `Engaging with post from @${username}: ${post.text?.substring(0, 50) || \"no text\"}...`\n );\n\n // Create necessary context for the post\n await this.ensurePostContext(post);\n\n // Handle the post (generate and send reply)\n const engaged = await this.engageWithPost(post);\n\n if (engaged) {\n engagementCount++;\n }\n }\n }\n }\n\n /**\n * Process timeline for engagement when wildcard is configured\n */\n private async processTimelineForEngagement() {\n try {\n // This would use the timeline client if available, but for now\n // we'll do a general search for recent popular posts\n const searchResult = await this.client.fetchSearchPosts(\n \"min_reposts:10 min_faves:20 -is:reply -is:repost lang:en\",\n 20,\n SearchMode.Latest\n );\n\n const relevantPosts = searchResult.posts.filter((post) => {\n // Filter for posts from the last 12 hours\n const postAge = Date.now() - getEpochMs(post.timestamp);\n return postAge < 12 * 60 * 60 * 1000;\n });\n\n if (relevantPosts.length > 0) {\n logger.info(`Found ${relevantPosts.length} relevant posts from timeline`);\n await this.processTargetUserPosts(relevantPosts, \"timeline\");\n }\n } catch (error) {\n logger.error(\n \"Error processing timeline for engagement:\",\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n /**\n * Determine if the bot should engage with a specific post\n */\n private async shouldEngageWithPost(post: ClientPost): Promise<boolean> {\n try {\n // Create a simple evaluation prompt\n const evaluationContext = {\n post: post.text,\n author: post.username,\n metrics: {\n likes: post.likes || 0,\n reposts: post.reposts || 0,\n replies: post.replies || 0,\n },\n };\n\n if (!post.id) {\n return false;\n }\n const shouldEngageMemory: Memory = {\n id: createUniqueUuid(this.runtime, `eval-${post.id}`),\n entityId: this.runtime.agentId,\n agentId: this.runtime.agentId,\n roomId: createUniqueUuid(this.runtime, post.conversationId || post.id),\n content: {\n text: `Should I engage with this post? Post: \"${post.text}\" by @${post.username}`,\n evaluationContext,\n },\n createdAt: Date.now(),\n };\n\n const _state = await this.runtime.composeState(shouldEngageMemory);\n const characterName = this.runtime?.character?.name || \"AI Assistant\";\n const context = `You are ${characterName}. Should you reply to this post based on your interests and expertise?\n \nPost by @${post.username}: \"${post.text}\"\n\nReply with YES if:\n- The topic relates to your interests or expertise\n- You can add valuable insights or perspective\n- The conversation seems constructive\n\nReply with NO if:\n- The topic is outside your knowledge\n- The post is inflammatory or controversial\n- You have nothing meaningful to add\n\nResponse (YES/NO):`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: context,\n temperature: 0.3,\n maxTokens: 10,\n });\n\n return response.trim().toUpperCase().includes(\"YES\");\n } catch (error) {\n logger.error(\n \"Error determining engagement:\",\n error instanceof Error ? error.message : String(error)\n );\n return false;\n }\n }\n\n /**\n * Ensure post context exists (world, room, entity)\n */\n private async ensurePostContext(post: ClientPost) {\n try {\n if (!post.userId || !post.username) {\n logger.warn(\"Cannot ensure context: missing userId or username\");\n return;\n }\n const context = await ensureContext(this.runtime, {\n userId: post.userId,\n username: post.username,\n name: post.name,\n conversationId: post.conversationId || post.id,\n });\n\n // Save post as memory with error handling\n // Convert Post to ContentValue-compatible format\n // Post properties are JSON-serializable and compatible with ContentValue\n const postContentValue: Record<string, ContentValue> = {\n id: post.id ?? null,\n text: post.text ?? null,\n userId: post.userId ?? null,\n username: post.username ?? null,\n timestamp: post.timestamp ?? null,\n conversationId: post.conversationId ?? null,\n likes: post.likes ?? null,\n reposts: post.reposts ?? null,\n replies: post.replies ?? null,\n quotes: post.quotes ?? null,\n permanentUrl: post.permanentUrl ?? null,\n };\n\n const postMemory: Memory = {\n id: createUniqueUuid(this.runtime, post.id || \"\"),\n entityId: context.entityId,\n content: {\n text: post.text,\n url: post.permanentUrl,\n source: \"x\",\n post: postContentValue,\n },\n agentId: this.runtime.agentId,\n roomId: context.roomId,\n createdAt: getEpochMs(post.timestamp),\n };\n\n await createMemorySafe(this.runtime, postMemory, \"messages\");\n } catch (error) {\n logger.error(\n `Failed to ensure context for post ${post.id}:`,\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n }\n }\n\n /**\n * Engage with a post by generating and sending a reply\n */\n private async engageWithPost(post: ClientPost): Promise<boolean> {\n try {\n const message: Memory = {\n id: createUniqueUuid(this.runtime, post.id || \"\"),\n entityId: createUniqueUuid(this.runtime, post.userId || \"\"),\n content: {\n text: post.text,\n source: \"x\",\n post: {\n id: post.id,\n text: post.text,\n userId: post.userId,\n username: post.username,\n timestamp: post.timestamp,\n conversationId: post.conversationId,\n } as Record<string, string | number | boolean | null | undefined>,\n },\n agentId: this.runtime.agentId,\n roomId: createUniqueUuid(this.runtime, post.conversationId || post.id || \"\"),\n createdAt: getEpochMs(post.timestamp),\n };\n\n const result = await this.handlePost({\n post,\n message,\n thread: post.thread || [post],\n });\n\n return typeof result.text === \"string\" && result.text.length > 0;\n } catch (error) {\n logger.error(\n \"Error engaging with post:\",\n error instanceof Error ? error.message : String(error)\n );\n return false;\n }\n }\n\n /**\n * Processes all incoming posts that mention the bot.\n * For each new post:\n * - Ensures world, room, and connection exist\n * - Saves the post as memory\n * - Emits thread-related events (THREAD_CREATED / THREAD_UPDATED)\n * - Delegates post content to `handlePost` for reply generation\n */\n async processMentionPosts(mentionCandidates: ClientPost[]) {\n logger.log(\"Completed checking mentioned posts:\", mentionCandidates.length.toString());\n let uniquePostCandidates = [...mentionCandidates];\n\n // Sort post candidates by ID in ascending order\n uniquePostCandidates = uniquePostCandidates\n .sort((a, b) => (a.id || \"\").localeCompare(b.id || \"\"))\n .filter((post) => post.userId && post.userId !== this.client.profile?.id);\n\n // Get X_TARGET_USERS configuration\n const targetUsersConfig =\n ((getSetting(this.runtime, \"X_TARGET_USERS\") ?? process.env.X_TARGET_USERS) as string) || \"\";\n\n // Filter posts based on X_TARGET_USERS if configured\n if (targetUsersConfig?.trim()) {\n uniquePostCandidates = uniquePostCandidates.filter((post) => {\n const shouldTarget = shouldTargetUser(post.username || \"\", targetUsersConfig);\n if (!shouldTarget) {\n logger.log(`Skipping post from @${post.username} - not in target users list`);\n }\n return shouldTarget;\n });\n }\n\n // Get max interactions per run setting\n const maxInteractionsPerRun = parseInt(\n (getSetting(this.runtime, \"X_MAX_ENGAGEMENTS_PER_RUN\") as string) ||\n process.env.X_MAX_ENGAGEMENTS_PER_RUN ||\n \"10\",\n 10\n );\n\n // Limit the number of interactions per run\n const postsToProcess = uniquePostCandidates.slice(0, maxInteractionsPerRun);\n logger.info(\n `Processing ${postsToProcess.length} of ${uniquePostCandidates.length} mention posts (max: ${maxInteractionsPerRun})`\n );\n\n // for each post candidate, handle the post\n for (const post of postsToProcess) {\n if (\n !this.client.lastCheckedPostId ||\n (post.id && BigInt(post.id) > this.client.lastCheckedPostId)\n ) {\n // Generate the postId UUID the same way it's done in handlePost\n const postId = createUniqueUuid(this.runtime, post.id || \"\");\n\n // Check if we've already processed this post\n const existingResponse = await this.runtime.getMemoryById(postId);\n\n if (existingResponse) {\n logger.log(`Already responded to post ${post.id}, skipping`);\n continue;\n }\n\n // Also check if we've already responded to this post (for chunked responses)\n // by looking for any memory with inReplyTo pointing to this post\n const conversationRoomId = createUniqueUuid(\n this.runtime,\n post.conversationId || post.id || \"\"\n );\n const existingReplies = await this.runtime.getMemories({\n tableName: \"messages\",\n roomId: conversationRoomId,\n count: 10, // Check recent messages in this room\n });\n\n // Check if any of the found memories is a reply to this specific post\n const hasExistingReply = existingReplies.some(\n (memory) => memory.content.inReplyTo === postId || memory.content.inReplyTo === post.id\n );\n\n if (hasExistingReply) {\n logger.log(\n `Already responded to post ${post.id} (found in conversation history), skipping`\n );\n continue;\n }\n\n logger.log(\"New Post found\", post.id);\n\n const userId = post.userId;\n if (!userId || !post.id) {\n logger.warn(\"Skipping post with missing required fields\", post.id);\n continue;\n }\n const conversationId = post.conversationId || post.id;\n if (!userId || !post.id) {\n logger.warn(\"Skipping post with missing required fields\", post.id);\n continue;\n }\n const roomId = createUniqueUuid(this.runtime, conversationId || \"\");\n const username = post.username;\n\n logger.log(\"----\");\n logger.log(`User: ${username} (${userId})`);\n logger.log(`Post: ${post.id}`);\n logger.log(`Conversation: ${conversationId}`);\n logger.log(`Room: ${roomId}`);\n logger.log(\"----\");\n\n // 1. Ensure world exists for the user\n const worldId = createUniqueUuid(this.runtime, userId || \"\");\n await this.runtime.ensureWorldExists({\n id: worldId,\n name: `${username}'s X`,\n agentId: this.runtime.agentId,\n messageServerId: userId as `${string}-${string}-${string}-${string}-${string}`,\n metadata: {\n ownership: { ownerId: userId || \"\" } as unknown as WorldOwnership,\n extra: {\n x: {\n username: username,\n id: userId,\n },\n },\n },\n });\n\n // 2. Ensure entity connection\n const entityId = createUniqueUuid(this.runtime, userId);\n await this.runtime.ensureConnection({\n entityId,\n roomId,\n userName: username,\n name: post.name,\n source: \"x\",\n type: ChannelType.FEED,\n worldId: worldId,\n });\n\n // 2.5. Ensure room exists\n await this.runtime.ensureRoomExists({\n id: roomId,\n name: `X conversation ${conversationId}`,\n source: \"x\",\n type: ChannelType.FEED,\n channelId: conversationId,\n messageServerId: createUniqueUuid(this.runtime, userId),\n worldId: worldId,\n });\n\n // 3. Create a memory for the post\n // Convert Post to ContentValue-compatible format\n const postContentValue: Record<string, ContentValue> = {\n id: post.id ?? null,\n text: post.text ?? null,\n userId: post.userId ?? null,\n username: post.username ?? null,\n timestamp: post.timestamp ?? null,\n conversationId: post.conversationId ?? null,\n };\n\n const memory: Memory = {\n id: postId,\n entityId,\n content: {\n text: post.text,\n url: post.permanentUrl,\n source: \"x\",\n post: postContentValue,\n },\n agentId: this.runtime.agentId,\n roomId,\n createdAt: getEpochMs(post.timestamp),\n };\n\n logger.log(\"Saving post memory...\");\n await createMemorySafe(this.runtime, memory, \"messages\");\n\n // 4. Handle thread-specific events\n if (post.thread && post.thread.length > 0) {\n const threadStartId = post.thread[0].id;\n const threadMemoryId = createUniqueUuid(this.runtime, `thread-${threadStartId}`);\n\n const threadPayload = {\n runtime: this.runtime,\n source: \"x\",\n entityId,\n conversationId: threadStartId,\n roomId: roomId,\n memory: memory,\n post: post,\n threadId: threadStartId,\n threadMemoryId: threadMemoryId,\n };\n\n // Check if this is a reply to an existing thread\n const previousThreadMemory = await this.runtime.getMemoryById(threadMemoryId);\n if (previousThreadMemory) {\n // This is a reply to an existing thread\n this.runtime.emitEvent(XEventTypes.THREAD_UPDATED, threadPayload);\n } else if (post.thread[0].id === post.id) {\n // This is the start of a new thread\n this.runtime.emitEvent(XEventTypes.THREAD_CREATED, threadPayload);\n }\n }\n\n await this.handlePost({\n post,\n message: memory,\n thread: post.thread,\n });\n\n // Update the last checked post ID after processing each post\n this.client.lastCheckedPostId = BigInt(post.id);\n }\n }\n }\n\n /**\n * Handles X interactions such as likes, reposts, and quotes.\n * For each interaction:\n * - Creates a memory object\n * - Emits platform-specific events (LIKE_RECEIVED, REPOST_RECEIVED, QUOTE_RECEIVED)\n * - Emits a generic REACTION_RECEIVED event with metadata\n */\n async handleInteraction(interaction: XInteractionPayload) {\n if (interaction?.targetPost?.conversationId) {\n const memory = this.createMemoryObject(\n interaction.type,\n `${interaction.id}-${interaction.type}`,\n interaction.userId,\n interaction.targetPost.conversationId\n );\n\n await createMemorySafe(this.runtime, memory, \"messages\");\n\n // Create message for reaction\n const reactionMessage: XMemory = {\n id: createUniqueUuid(this.runtime, interaction.targetPostId || \"\"),\n content: {\n text: interaction.targetPost.text || \"\",\n source: \"x\",\n },\n entityId: createUniqueUuid(this.runtime, interaction.userId || \"\"),\n roomId: createUniqueUuid(this.runtime, interaction.targetPost.conversationId || \"\"),\n agentId: this.runtime.agentId,\n createdAt: Date.now(),\n };\n\n // Emit specific event for each type of interaction\n switch (interaction.type) {\n case \"like\": {\n const payload: XLikeReceivedPayload = {\n runtime: this.runtime,\n post: interaction.targetPost,\n user: {\n id: interaction.userId,\n username: interaction.username,\n name: interaction.name,\n },\n source: \"x\",\n };\n this.runtime.emitEvent(XEventTypes.LIKE_RECEIVED, payload);\n break;\n }\n case \"repost\": {\n const payload: XRepostReceivedPayload = {\n runtime: this.runtime,\n post: interaction.targetPost,\n repostId: interaction.repostId || interaction.id,\n user: {\n id: interaction.userId,\n username: interaction.username,\n name: interaction.name,\n },\n source: \"x\",\n };\n this.runtime.emitEvent(XEventTypes.REPOST_RECEIVED, payload);\n break;\n }\n case \"quote\": {\n const payload: XQuoteReceivedPayload = {\n runtime: this.runtime,\n quotedPost: interaction.targetPost,\n quotePost: interaction.quotePost || interaction.targetPost,\n user: {\n id: interaction.userId,\n username: interaction.username,\n name: interaction.name,\n },\n message: reactionMessage,\n callback: async () => [],\n reaction: {\n type: \"quote\",\n entityId: createUniqueUuid(this.runtime, interaction.userId),\n },\n source: \"x\",\n };\n this.runtime.emitEvent(XEventTypes.QUOTE_RECEIVED, payload);\n break;\n }\n }\n\n // Also emit generic REACTION_RECEIVED event\n this.runtime.emitEvent(EventType.REACTION_RECEIVED, {\n runtime: this.runtime,\n entityId: createUniqueUuid(this.runtime, interaction.userId),\n roomId: createUniqueUuid(this.runtime, interaction.targetPost.conversationId),\n world: createUniqueUuid(this.runtime, interaction.userId),\n message: reactionMessage,\n source: \"x\",\n metadata: {\n type: interaction.type,\n targetPostId: interaction.targetPostId,\n username: interaction.username,\n userId: interaction.userId,\n timestamp: Date.now(),\n quoteText: interaction.type === \"quote\" ? interaction.quotePost?.text || \"\" : undefined,\n },\n callback: async () => [],\n } as MessagePayload);\n }\n }\n\n /**\n * Creates a memory object for a given X interaction.\n *\n * @param {string} type - The type of interaction (e.g., 'like', 'repost', 'quote').\n * @param {string} id - The unique identifier for the interaction.\n * @param {string} userId - The ID of the user who initiated the interaction.\n * @param {string} conversationId - The ID of the conversation context.\n * @returns {XInteractionMemory} The constructed memory object.\n */\n createMemoryObject(\n type: string,\n id: string,\n userId: string,\n conversationId: string\n ): XInteractionMemory {\n return {\n id: createUniqueUuid(this.runtime, id),\n agentId: this.runtime.agentId,\n entityId: createUniqueUuid(this.runtime, userId),\n roomId: createUniqueUuid(this.runtime, conversationId),\n content: {\n type,\n source: \"x\",\n },\n createdAt: Date.now(),\n };\n }\n\n /**\n * Asynchronously handles a post by generating a response and sending it.\n * This method processes the post content, determines if a response is needed,\n * generates appropriate response text, and sends the post reply.\n *\n * @param {object} params - The parameters object containing the post, message, and thread.\n * @param {Post} params.post - The post object to handle.\n * @param {Memory} params.message - The memory object associated with the post.\n * @param {Post[]} params.thread - The array of posts in the thread.\n * @returns {object} - An object containing the text of the response and any relevant actions.\n */\n async handlePost({\n post,\n message,\n thread,\n }: {\n post: ClientPost;\n message: Memory;\n thread: ClientPost[];\n }) {\n if (!message.content.text) {\n logger.log(\"Skipping Post with no text\", post.id);\n return { text: \"\", actions: [\"IGNORE\"] };\n }\n\n // Create a callback for handling the response\n const callback: HandlerCallback = async (response: Content, postId?: string) => {\n try {\n if (!response.text) {\n logger.warn(\"No text content in response, skipping post reply\");\n return [];\n }\n\n const postToReplyTo = postId || post.id;\n\n if (this.isDryRun) {\n logger.info(`[DRY RUN] Would have replied to ${post.username} with: ${response.text}`);\n return [];\n }\n\n logger.info(`Replying to post ${postToReplyTo}`);\n\n // Create the actual post using the X API through the client\n const postResult = await sendPost(this.client, response.text, [], postToReplyTo);\n\n if (!postResult) {\n throw new Error(\"Failed to get post result from response\");\n }\n\n // Create memory for our response\n const responsePostId = postResult.id || postResult.data?.id || Date.now().toString();\n const responseId = createUniqueUuid(this.runtime, responsePostId);\n const responseMemory: Memory = {\n id: responseId,\n entityId: this.runtime.agentId,\n agentId: this.runtime.agentId,\n roomId: message.roomId,\n content: {\n text: response.text,\n source: \"x\",\n inReplyTo: message.id,\n },\n createdAt: Date.now(),\n };\n\n await createMemorySafe(this.runtime, responseMemory, \"messages\");\n\n // Return the created memory\n return [responseMemory];\n } catch (error) {\n logger.error(\n \"Error in post reply callback:\",\n error instanceof Error ? error.message : String(error)\n );\n return [];\n }\n };\n\n const xUserId = post.userId || \"\";\n const entityId = createUniqueUuid(this.runtime, xUserId);\n const xUsername = post.username || \"\";\n\n // Add X-specific metadata to message\n if (!message.metadata || Array.isArray(message.metadata)) {\n message.metadata = { type: MemoryType.CUSTOM };\n }\n const metadataObj =\n typeof message.metadata === \"object\" && !Array.isArray(message.metadata)\n ? message.metadata\n : { type: MemoryType.CUSTOM };\n\n // Create properly typed CustomMetadata with X-specific properties\n // CustomMetadata allows additional properties via index signature\n message.metadata = {\n ...metadataObj,\n type: (metadataObj.type as MemoryType) || MemoryType.CUSTOM,\n x: {\n entityId: entityId as string,\n xUserId: xUserId as string,\n xUsername: xUsername as string,\n thread: thread,\n },\n } as unknown as MemoryMetadata;\n\n // Process message through message service\n const result = await this.runtime.messageService?.handleMessage(\n this.runtime,\n message,\n callback\n );\n\n // Extract response for X posting\n const response = result?.responseMessages || [];\n\n // Check if response is an array of memories and extract the text\n let responseText = \"\";\n if (Array.isArray(response) && response.length > 0) {\n const firstResponse = response[0];\n if (firstResponse?.content?.text) {\n responseText = firstResponse.content.text;\n }\n }\n\n return {\n text: responseText,\n actions: responseText ? [\"REPLY\"] : [\"IGNORE\"],\n };\n }\n}\n",
109
- "/**\n * Auto-generated prompt templates\n * DO NOT EDIT - Generated from ../../../../prompts/*.txt\n *\n * These prompts use Handlebars-style template syntax:\n * - {{variableName}} for simple substitution\n * - {{#each items}}...{{/each}} for iteration\n * - {{#if condition}}...{{/if}} for conditionals\n */\n\nexport const generatePostTemplate = `You are {{agentName}}.\n{{bio}}\n\nGenerate a post based on: {{request}}\n\nStyle:\n- Be specific, opinionated, authentic\n- No generic content or platitudes\n- Share insights, hot takes, unique perspectives\n- Conversational and punchy\n- Under 280 characters\n- Skip hashtags unless essential\n\nTopics: {{topics}}\n\nPost:`;\n\nexport const GENERATE_POST_TEMPLATE = generatePostTemplate;\n\nexport const messageHandlerTemplate = `{{agentName}} is replying to you:\n{{senderName}}: {{userMessage}}\n\n# Task: Generate a reply for {{agentName}}.\n{{providers}}\n\n# Instructions: Write a thoughtful response to {{senderName}} that is appropriate and relevant to their message. Do not including any thinking, self-reflection or internal dialog in your response.`;\n\nexport const MESSAGE_HANDLER_TEMPLATE = messageHandlerTemplate;\n\nexport const quoteTweetTemplate = `# Task: Write a quote post in the voice, style, and perspective of {{agentName}} @{{xUserName}}.\n\n{{bio}}\n{{postDirections}}\n\n<response>\n <thought>Your thought here, explaining why the quote post is meaningful or how it connects to what {{agentName}} cares about</thought>\n <post>The quote post content here, under 280 characters, without emojis, no questions</post>\n</response>\n\nYour quote post should be:\n- A reaction, agreement, disagreement, or expansion of the original post\n- Personal and unique to {{agentName}}'s style and point of view\n- 1 to 3 sentences long, chosen at random\n- No questions, no emojis, concise\n- Use \"\\\\n\\\\n\" (double spaces) between multiple sentences\n- Max 280 characters including line breaks\n\nYour output must ONLY contain the XML block.`;\n\nexport const QUOTE_TWEET_TEMPLATE = quoteTweetTemplate;\n\nexport const replyTweetTemplate = `# Task: Write a reply post in the voice, style, and perspective of {{agentName}} @{{xUserName}}.\n\n{{bio}}\n{{postDirections}}\n\n<response>\n <thought>Your thought here, explaining why this reply is meaningful or how it connects to what {{agentName}} cares about</thought>\n <post>The reply post content here, under 280 characters, without emojis, no questions</post>\n</response>\n\nYour reply should be:\n- A direct response, agreement, disagreement, or personal take on the original post\n- Reflective of {{agentName}}'s unique voice and values\n- 1 to 2 sentences long, chosen at random\n- No questions, no emojis, concise\n- Use \"\\\\n\\\\n\" (double spaces) between multiple sentences if needed\n- Max 280 characters including line breaks\n\nYour output must ONLY contain the XML block.`;\n\nexport const REPLY_TWEET_TEMPLATE = replyTweetTemplate;\n\nexport const xActionTemplate = `# INSTRUCTIONS: Determine actions for {{agentName}} (@{{xUserName}}) based on:\n{{bio}}\n{{postDirections}}\n\nGuidelines:\n- Engage with content that relates to character's interests and expertise\n- Direct mentions should be prioritized when relevant\n- Consider engaging with:\n - Content directly related to your topics\n - Interesting discussions you can contribute to\n - Questions you can help answer\n - Content from users you've interacted with before\n- Skip content that is:\n - Completely off-topic or spam\n - Inflammatory or highly controversial (unless it's your area)\n - Pure marketing/promotional with no value\n\nActions (respond only with tags):\n[LIKE] - Content is relevant and interesting (7/10 or higher)\n[REPOST] - Content is valuable and worth sharing (8/10 or higher)\n[QUOTE] - You can add meaningful commentary (7.5/10 or higher)\n[REPLY] - You can contribute helpful insights (7/10 or higher)`;\n\nexport const X_ACTION_TEMPLATE = xActionTemplate;\n\nexport const xMessageHandlerTemplate = `# Task: Generate dialog and actions for {{agentName}}.\n{{providers}}\nHere is the current post text again. Remember to include an action if the current post text includes a prompt that asks for one of the available actions mentioned above (does not need to be exact)\n{{currentPost}}\n{{imageDescriptions}}\n\n# Instructions: Write the next message for {{agentName}}. Include the appropriate action from the list: {{actionNames}}\nResponse format should be formatted in a valid JSON block like this:\n\\`\\`\\`json\n{ \"thought\": \"<string>\", \"name\": \"{{agentName}}\", \"text\": \"<string>\", \"action\": \"<string>\" }\n\\`\\`\\`\n\nThe \"action\" field should be one of the options in [Available Actions] and the \"text\" field should be the response you want to send. Do not including any thinking or internal reflection in the \"text\" field. \"thought\" should be a short description of what the agent is thinking about before responding, inlcuding a brief justification for the response.`;\n\nexport const X_MESSAGE_HANDLER_TEMPLATE = xMessageHandlerTemplate;\n\n",
110
- "import {\n ChannelType,\n createUniqueUuid,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseBooleanFromText,\n type UUID,\n} from \"@elizaos/core\";\nimport type { ClientBase } from \"./base\";\nimport { getRandomInterval } from \"./environment\";\nimport type { MediaData, PostResponse } from \"./types\";\nimport { sendPost } from \"./utils\";\nimport {\n addToRecentPosts,\n createMemorySafe,\n ensureXContext,\n isDuplicatePost,\n} from \"./utils/memory\";\nimport { getSetting } from \"./utils/settings\";\n/**\n * Class representing an X post client for generating and posting.\n */\nexport class XPostClient {\n client: ClientBase;\n runtime: IAgentRuntime;\n xUsername: string;\n private isDryRun: boolean;\n private state: Record<string, unknown>;\n private isRunning: boolean = false;\n private isPosting: boolean = false; // Add lock to prevent concurrent posting\n\n /**\n * Creates an instance of XPostClient.\n * @param {ClientBase} client - The client instance.\n * @param {IAgentRuntime} runtime - The runtime instance.\n * @param {Record<string, unknown>} state - The state object containing configuration settings\n */\n constructor(client: ClientBase, runtime: IAgentRuntime, state: Record<string, unknown>) {\n this.client = client;\n this.state = state;\n this.runtime = runtime;\n const dryRunSetting =\n typeof this.state?.X_DRY_RUN === \"string\" ||\n typeof this.state?.X_DRY_RUN === \"boolean\" ||\n this.state?.X_DRY_RUN === true ||\n this.state?.X_DRY_RUN === false\n ? this.state.X_DRY_RUN\n : getSetting(this.runtime, \"X_DRY_RUN\");\n this.isDryRun = parseBooleanFromText(dryRunSetting);\n\n // Get X username from settings\n const usernameSetting = getSetting(this.runtime, \"X_USERNAME\") || this.state?.X_USERNAME;\n this.xUsername = typeof usernameSetting === \"string\" ? usernameSetting : \"\";\n\n // Log configuration on initialization\n logger.log(\"X Post Client Configuration:\");\n logger.log(`- Dry Run Mode: ${this.isDryRun ? \"Enabled\" : \"Disabled\"}`);\n\n const postIntervalMin = parseInt(\n (typeof this.state?.X_POST_INTERVAL_MIN === \"string\"\n ? this.state.X_POST_INTERVAL_MIN\n : null) ||\n (getSetting(this.runtime, \"X_POST_INTERVAL_MIN\") as string) ||\n \"90\",\n 10\n );\n const postIntervalMax = parseInt(\n (typeof this.state?.X_POST_INTERVAL_MAX === \"string\"\n ? this.state.X_POST_INTERVAL_MAX\n : null) ||\n (getSetting(this.runtime, \"X_POST_INTERVAL_MAX\") as string) ||\n \"150\",\n 10\n );\n logger.log(`- Post Interval: ${postIntervalMin}-${postIntervalMax} minutes (randomized)`);\n }\n\n /**\n * Stops the X post client\n */\n async stop() {\n logger.log(\"Stopping X post client...\");\n this.isRunning = false;\n }\n\n /**\n * Starts the X post client, setting up a loop to periodically generate new posts.\n */\n async start() {\n logger.log(\"Starting X post client...\");\n this.isRunning = true;\n\n const generateNewPostLoop = async () => {\n if (!this.isRunning) {\n logger.log(\"X post client stopped, exiting loop\");\n return;\n }\n\n await this.generateNewPost();\n\n if (!this.isRunning) {\n logger.log(\"X post client stopped after post, exiting loop\");\n return;\n }\n\n // Get random post interval in minutes\n const postIntervalMinutes = getRandomInterval(this.runtime, \"post\");\n\n // Convert to milliseconds\n const interval = postIntervalMinutes * 60 * 1000;\n\n logger.info(`Next post scheduled in ${postIntervalMinutes.toFixed(1)} minutes`);\n\n // Wait for the interval AFTER generating the post\n await new Promise((resolve) => setTimeout(resolve, interval));\n\n if (this.isRunning) {\n // Schedule the next iteration\n generateNewPostLoop();\n }\n };\n\n // Wait a bit longer to ensure profile is loaded\n await new Promise((resolve) => setTimeout(resolve, 5000));\n\n // Check if we should generate a post immediately\n const postImmediately =\n typeof this.state?.X_POST_IMMEDIATELY === \"string\" ||\n typeof this.state?.X_POST_IMMEDIATELY === \"boolean\"\n ? this.state.X_POST_IMMEDIATELY\n : (getSetting(this.runtime, \"X_POST_IMMEDIATELY\") as string);\n\n if (parseBooleanFromText(postImmediately)) {\n logger.info(\"X_POST_IMMEDIATELY is true, generating initial post now\");\n // Try multiple times in case profile isn't ready\n let retries = 0;\n while (retries < 5) {\n const success = await this.generateNewPost();\n if (success) break;\n\n retries++;\n logger.info(`Retrying immediate post (attempt ${retries}/5)...`);\n await new Promise((resolve) => setTimeout(resolve, 3000));\n }\n }\n\n // Start the regular generation loop\n generateNewPostLoop();\n }\n\n /**\n * Handles the creation and posting of a post by emitting standardized events.\n * This approach aligns with our platform-independent architecture.\n * @returns {Promise<boolean>} true if post was posted successfully\n */\n async generateNewPost(): Promise<boolean> {\n logger.info(\"Attempting to generate new post...\");\n\n // Prevent concurrent posting\n if (this.isPosting) {\n logger.info(\"Already posting, skipping concurrent attempt\");\n return false;\n }\n\n this.isPosting = true;\n\n try {\n // Create the timeline room ID for storing the post\n const userId = this.client.profile?.id;\n if (!userId) {\n logger.error(\"Cannot generate post: X profile not available\");\n this.isPosting = false; // Reset flag\n return false;\n }\n\n logger.info(`Generating post for user: ${this.client.profile?.username} (${userId})`);\n\n // Create standardized world and room IDs\n const _worldId = createUniqueUuid(this.runtime, userId) as UUID;\n const roomId = createUniqueUuid(this.runtime, `${userId}-home`) as UUID;\n\n // Generate post content using the runtime's model\n const state = await this.runtime\n .composeState({\n agentId: this.runtime.agentId,\n entityId: this.runtime.agentId,\n roomId,\n content: { text: \"\", type: \"post\" },\n createdAt: Date.now(),\n } as Memory)\n .catch((error) => {\n logger.warn(\"Error composing state, using minimal state:\", error);\n // Return minimal state if composition fails\n return {\n agentId: this.runtime.agentId,\n recentMemories: [],\n values: {},\n };\n });\n\n // Create a prompt for post generation\n const postPrompt = `You are ${this.runtime.character.name}.\n${this.runtime.character.bio}\n\nCRITICAL: Generate a post that sounds like YOU, not a generic motivational poster or LinkedIn influencer.\n\n${\n this.runtime.character.messageExamples && this.runtime.character.messageExamples.length > 0\n ? `\nExample posts that capture your voice:\n${(\n this.runtime.character.messageExamples as Array<{\n examples?: Array<{ content?: { text?: string } }>;\n }>\n)\n .flatMap((group) => group.examples ?? [])\n .map((example) => example.content?.text ?? \"\")\n .filter((text) => text.length > 0)\n .slice(0, 5)\n .join(\"\\n\")}\n`\n : \"\"\n}\n\nStyle guidelines:\n- Be authentic, opinionated, and specific - no generic platitudes\n- Use your unique voice and perspective\n- Share hot takes, unpopular opinions, or specific insights\n- Be conversational, not preachy\n- If you use emojis, use them sparingly and purposefully\n- Length: 50-280 characters (keep it punchy)\n- NO hashtags unless absolutely essential\n- NO generic motivational content\n\nYour interests: ${this.runtime.character.topics?.join(\", \") || \"technology, crypto, AI\"}\n\n${\n this.runtime.character.style\n ? `Your style: ${\n typeof this.runtime.character.style === \"object\"\n ? this.runtime.character.style.all?.join(\", \") ||\n JSON.stringify(this.runtime.character.style)\n : this.runtime.character.style\n }`\n : \"\"\n}\n\nRecent context:\n${\n Array.isArray(state.recentMemories) && state.recentMemories.length > 0\n ? state.recentMemories\n .slice(0, 3)\n .map((m: Memory) => m.content?.text || \"\")\n .join(\"\\n\") || \"No recent context\"\n : \"No recent context\"\n}\n\nGenerate a single post that sounds like YOU would actually write it:`;\n\n // Use the runtime's model to generate post content\n const generatedContent = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: postPrompt,\n temperature: 0.9, // Increased for more creativity\n maxTokens: 100,\n });\n\n const postText = generatedContent.trim();\n\n if (!postText || postText.length === 0) {\n logger.error(\"Generated empty post content\");\n return false;\n }\n\n if (postText.includes(\"Error: Missing\")) {\n logger.error(\"Error in generated content:\", postText);\n return false;\n }\n\n // Validate post length\n if (postText.length > 280) {\n logger.warn(`Generated post too long (${postText.length} chars), truncating...`);\n // Truncate to the last complete sentence within 280 chars\n const sentences = postText.match(/[^.!?]+[.!?]+/g) || [postText];\n let truncated = \"\";\n for (const sentence of sentences) {\n if ((truncated + sentence).length <= 280) {\n truncated += sentence;\n } else {\n break;\n }\n }\n const finalPost = truncated.trim() || `${postText.substring(0, 277)}...`;\n logger.info(`Truncated post: ${finalPost}`);\n\n // Post the truncated post\n if (this.isDryRun) {\n logger.info(`[DRY RUN] Would post: ${finalPost}`);\n return false;\n }\n\n const result = await this.postToX(finalPost, []);\n\n if (result === null) {\n logger.info(\"Skipped posting duplicate post\");\n return false;\n }\n\n const postId = result.id ?? result.data?.id ?? result.data?.data?.id;\n logger.info(`Post created successfully! ID: ${postId}`);\n\n // Don't save to memory if room creation might fail\n logger.info(\"Post created successfully (memory saving disabled due to room constraints)\");\n return true;\n }\n\n logger.info(`Generated post: ${postText}`);\n\n // Post the post\n if (this.isDryRun) {\n logger.info(`[DRY RUN] Would post: ${postText}`);\n return false;\n }\n\n const result = await this.postToX(postText, []);\n\n // If result is null, it means we detected a duplicate post and skipped posting\n if (result === null) {\n logger.info(\"Skipped posting duplicate post\");\n return false;\n }\n\n const postId = result.id ?? result.data?.id ?? result.data?.data?.id;\n logger.info(`Post created successfully! ID: ${postId}`);\n\n if (result && postId) {\n const postedPostId = createUniqueUuid(this.runtime, postId);\n\n try {\n // Ensure context exists with error handling\n const context = await ensureXContext(this.runtime, {\n userId,\n username: this.client.profile?.username || \"unknown\",\n conversationId: `${userId}-home`,\n });\n\n // Create memory for the posted post with retry logic\n const postedMemory: Memory = {\n id: postedPostId,\n entityId: this.runtime.agentId,\n agentId: this.runtime.agentId,\n roomId: context.roomId,\n content: {\n text: postText,\n source: \"x\",\n channelType: ChannelType.FEED,\n type: \"post\",\n metadata: {\n postId,\n postedAt: Date.now(),\n },\n },\n createdAt: Date.now(),\n };\n\n await createMemorySafe(this.runtime, postedMemory, \"messages\");\n logger.info(\"Post created and saved to memory successfully\");\n } catch (error) {\n logger.error(\n \"Failed to save post memory:\",\n error instanceof Error ? error.message : String(error)\n );\n // Don't fail the post creation if memory creation fails\n }\n\n return true;\n } else {\n logger.warn(\"Post generation returned no result\");\n return false;\n }\n } catch (error) {\n logger.error(\n \"Error generating post:\",\n error instanceof Error ? error.message : String(error)\n );\n return false;\n } finally {\n this.isPosting = false;\n }\n }\n\n /**\n * Posts content to X\n * @param {string} text The post text to create\n * @param {MediaData[]} mediaData Optional media to attach to the post\n * @returns {Promise<PostResponse | null>} The result from the X API\n */\n private async postToX(text: string, mediaData: MediaData[] = []): Promise<PostResponse | null> {\n // Check if this post is a duplicate of recent posts\n const username = this.client.profile?.username;\n if (!username) {\n logger.error(\"No profile username available\");\n return null;\n }\n\n // Check for duplicates in recent posts\n const isDuplicate = await isDuplicatePost(this.runtime, username, text);\n if (isDuplicate) {\n logger.warn(\"Post is a duplicate of a recent post. Skipping to avoid duplicate.\");\n return null;\n }\n\n // Handle media uploads if needed\n const _mediaIds: string[] = [];\n\n if (mediaData && mediaData.length > 0) {\n logger.warn(\"Media upload not currently supported with the modern X API\");\n }\n\n const result = await sendPost(this.client, text, mediaData);\n\n // Add to recent posts cache to prevent future duplicates\n await addToRecentPosts(this.runtime, username, text);\n\n return result;\n }\n}\n",
111
- "import {\n ChannelType,\n composePromptFromState,\n createUniqueUuid,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type State,\n type UUID,\n} from \"@elizaos/core\";\nimport type { ClientBase } from \"./base\";\nimport type { Client, Post } from \"./client/index\";\nimport { quotePostTemplate, replyPostTemplate, xActionTemplate } from \"./templates\";\nimport type { ActionResponse } from \"./types\";\nimport { parseActionResponseFromText, sendPost } from \"./utils\";\nimport { createMemorySafe, ensureXContext, isPostProcessed } from \"./utils/memory\";\nimport { getSetting } from \"./utils/settings\";\nimport { getEpochMs } from \"./utils/time\";\n\nenum TIMELINE_TYPE {\n ForYou = \"foryou\",\n Following = \"following\",\n}\n\nexport class XTimelineClient {\n client: ClientBase;\n xClient: Client;\n runtime: IAgentRuntime;\n isDryRun: boolean;\n timelineType: TIMELINE_TYPE;\n private state: Record<string, unknown>;\n private isRunning: boolean = false;\n\n constructor(client: ClientBase, runtime: IAgentRuntime, state: Record<string, unknown>) {\n this.client = client;\n this.xClient = client.xClient;\n this.runtime = runtime;\n this.state = state;\n\n const dryRunSetting =\n this.state?.X_DRY_RUN ?? getSetting(this.runtime, \"X_DRY_RUN\") ?? process.env.X_DRY_RUN;\n this.isDryRun =\n dryRunSetting === true ||\n dryRunSetting === \"true\" ||\n (typeof dryRunSetting === \"string\" && dryRunSetting.toLowerCase() === \"true\");\n\n // Load timeline mode from runtime settings or use default\n const timelineMode = getSetting(this.runtime, \"X_TIMELINE_MODE\") ?? process.env.X_TIMELINE_MODE;\n this.timelineType =\n timelineMode === TIMELINE_TYPE.Following ? TIMELINE_TYPE.Following : TIMELINE_TYPE.ForYou;\n }\n\n async start() {\n logger.info(\"Starting X timeline client...\");\n this.isRunning = true;\n\n const handleXTimelineLoop = () => {\n if (!this.isRunning) {\n logger.info(\"X timeline client stopped, exiting loop\");\n return;\n }\n\n // Use standard engagement interval\n const engagementIntervalMinutes = parseInt(\n (typeof this.state?.X_ENGAGEMENT_INTERVAL === \"string\"\n ? this.state.X_ENGAGEMENT_INTERVAL\n : null) ||\n (getSetting(this.runtime, \"X_ENGAGEMENT_INTERVAL\") as string) ||\n process.env.X_ENGAGEMENT_INTERVAL ||\n \"30\",\n 10\n );\n const actionInterval = engagementIntervalMinutes * 60 * 1000;\n\n logger.info(`Timeline client will check every ${engagementIntervalMinutes} minutes`);\n\n this.handleTimeline();\n\n if (this.isRunning) {\n setTimeout(handleXTimelineLoop, actionInterval);\n }\n };\n handleXTimelineLoop();\n }\n\n async stop() {\n logger.info(\"Stopping X timeline client...\");\n this.isRunning = false;\n }\n\n async getTimeline(count: number): Promise<Post[]> {\n const xUsername = this.client.profile?.username;\n const homeTimeline =\n this.timelineType === TIMELINE_TYPE.Following\n ? await this.xClient.fetchFollowingTimeline(count, [])\n : await this.xClient.fetchHomeTimeline(count, []);\n\n // The timeline methods now return Post objects directly from v2 API\n return homeTimeline.filter((post) => post.username !== xUsername); // do not perform action on self-posts\n }\n\n createPostId(runtime: IAgentRuntime, post: Post) {\n if (!post.id) {\n throw new Error(\"Post ID is required\");\n }\n return createUniqueUuid(runtime, post.id);\n }\n\n formMessage(runtime: IAgentRuntime, post: Post) {\n if (!post.id || !post.userId || !post.conversationId) {\n throw new Error(\"Post missing required fields: id, userId, or conversationId\");\n }\n return {\n id: this.createPostId(runtime, post),\n agentId: runtime.agentId,\n content: {\n text: post.text,\n url: post.permanentUrl,\n imageUrls: post.photos?.map((photo) => photo.url) || [],\n inReplyTo: post.inReplyToStatusId\n ? createUniqueUuid(runtime, post.inReplyToStatusId)\n : undefined,\n source: \"x\",\n channelType: ChannelType.GROUP,\n post: {\n id: post.id,\n text: post.text,\n userId: post.userId,\n username: post.username,\n timestamp: post.timestamp,\n conversationId: post.conversationId,\n } as Record<string, string | number | boolean | null | undefined>,\n },\n entityId: createUniqueUuid(runtime, post.userId),\n roomId: createUniqueUuid(runtime, post.conversationId),\n createdAt: getEpochMs(post.timestamp),\n };\n }\n\n async handleTimeline() {\n logger.info(\"Starting X timeline processing...\");\n\n const posts = await this.getTimeline(20);\n logger.info(`Fetched ${posts.length} posts from timeline`);\n\n // Use max engagements per run from environment\n const maxActionsPerCycle = parseInt(\n (getSetting(this.runtime, \"X_MAX_ENGAGEMENTS_PER_RUN\") as string) ||\n process.env.X_MAX_ENGAGEMENTS_PER_RUN ||\n \"10\",\n 10\n );\n\n const postDecisions: Array<{\n post: Post;\n actionResponse: ActionResponse;\n postState: State;\n roomId: UUID;\n }> = [];\n for (const post of posts) {\n try {\n // Check if already processed using utility\n if (!post.id) {\n logger.warn(\"Skipping post with no ID\");\n continue;\n }\n const isProcessed = await isPostProcessed(this.runtime, post.id);\n if (isProcessed) {\n logger.log(`Already processed post ID: ${post.id}`);\n continue;\n }\n\n if (!post.conversationId) {\n logger.warn(\"Skipping post with no conversationId\");\n continue;\n }\n const roomId = createUniqueUuid(this.runtime, post.conversationId);\n\n const message = this.formMessage(this.runtime, post);\n\n const state = await this.runtime.composeState(message);\n\n const actionRespondPrompt =\n composePromptFromState({\n state,\n template: this.runtime.character.templates?.xActionTemplate || xActionTemplate,\n }) +\n `\nPost:\n${post.text}\n\n# Respond with qualifying action tags only.\n\nChoose any combination of [LIKE], [REPOST], [QUOTE], and [REPLY] that are appropriate. Each action must be on its own line. Your response must only include the chosen actions.`;\n\n const actionResponse = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: actionRespondPrompt,\n });\n const parsedResponse = parseActionResponseFromText(actionResponse);\n\n // Ensure a valid action response was generated\n if (!parsedResponse || !parsedResponse.actions) {\n logger.debug(`No action response generated for post ${post.id}`);\n continue;\n }\n\n postDecisions.push({\n post,\n actionResponse: parsedResponse.actions,\n postState: state,\n roomId,\n });\n\n // Limit the number of actions per cycle\n if (postDecisions.length >= maxActionsPerCycle) break;\n } catch (error) {\n logger.error(\n `Error processing post ${post.id}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n // Rank by the quality of the response\n const rankByActionRelevance = (arr: typeof postDecisions) => {\n return arr.sort((a, b) => {\n const countTrue = (obj: typeof a.actionResponse) =>\n Object.values(obj).filter(Boolean).length;\n\n const countA = countTrue(a.actionResponse);\n const countB = countTrue(b.actionResponse);\n\n // Primary sort by number of true values\n if (countA !== countB) {\n return countB - countA;\n }\n\n // Secondary sort by the \"like\" property\n if (a.actionResponse.like !== b.actionResponse.like) {\n return a.actionResponse.like ? -1 : 1;\n }\n\n // Tertiary sort keeps the remaining objects with equal weight\n return 0;\n });\n };\n // Sort the timeline based on the action decision score,\n const prioritizedPosts = rankByActionRelevance(postDecisions);\n\n logger.info(`Processing ${prioritizedPosts.length} posts with actions`);\n if (prioritizedPosts.length > 0) {\n const actionSummary = prioritizedPosts.map((td: (typeof postDecisions)[0]) => {\n const actions = [];\n if (td.actionResponse.like) actions.push(\"LIKE\");\n if (td.actionResponse.repost) actions.push(\"REPOST\");\n if (td.actionResponse.quote) actions.push(\"QUOTE\");\n if (td.actionResponse.reply) actions.push(\"REPLY\");\n return `Post ${td.post.id}: ${actions.join(\", \")}`;\n });\n logger.info(`Actions to execute:\\n${actionSummary.join(\"\\n\")}`);\n }\n\n await this.processTimelineActions(prioritizedPosts);\n logger.info(\"Timeline processing complete\");\n }\n\n private async processTimelineActions(\n postDecisions: {\n post: Post;\n actionResponse: ActionResponse;\n postState: State;\n roomId: UUID;\n }[]\n ): Promise<\n {\n postId: string;\n actionResponse: ActionResponse;\n executedActions: string[];\n }[]\n > {\n const results = [];\n\n for (const { post, actionResponse, postState: _postState, roomId } of postDecisions) {\n const postId = this.createPostId(this.runtime, post);\n const executedActions = [];\n\n // Ensure room exists before creating memory\n await this.runtime.ensureRoomExists({\n id: roomId,\n name: `X conversation ${post.conversationId}`,\n source: \"x\",\n type: ChannelType.GROUP,\n channelId: post.conversationId,\n messageServerId: createUniqueUuid(this.runtime, post.userId || \"\"),\n worldId: createUniqueUuid(this.runtime, post.userId || \"\"),\n });\n\n // Update memory with processed post using safe method\n if (!post.userId) {\n logger.warn(\"Skipping post with no userId\");\n continue;\n }\n const postMemory: Memory = {\n id: postId,\n entityId: createUniqueUuid(this.runtime, post.userId),\n content: {\n text: post.text,\n url: post.permanentUrl,\n source: \"x\",\n channelType: ChannelType.GROUP,\n post: {\n id: post.id,\n text: post.text,\n userId: post.userId,\n username: post.username,\n timestamp: post.timestamp,\n conversationId: post.conversationId,\n } as Record<string, string | number | boolean | null | undefined>,\n },\n agentId: this.runtime.agentId,\n roomId,\n createdAt: getEpochMs(post.timestamp),\n };\n\n await createMemorySafe(this.runtime, postMemory, \"messages\");\n\n try {\n // ensure world and rooms, connections, and worlds are created\n const userId = post.userId;\n if (!userId) {\n logger.warn(\"Cannot create world/entity: userId is undefined\");\n continue;\n }\n const worldId = createUniqueUuid(this.runtime, userId);\n const entityId = createUniqueUuid(this.runtime, userId);\n\n await this.ensurePostWorldContext(post, roomId, worldId, entityId);\n\n if (actionResponse.like) {\n await this.handleLikeAction(post);\n executedActions.push(\"like\");\n }\n\n if (actionResponse.repost) {\n await this.handleRepostAction(post);\n executedActions.push(\"repost\");\n }\n\n if (actionResponse.quote) {\n await this.handleQuoteAction(post);\n executedActions.push(\"quote\");\n }\n\n if (actionResponse.reply) {\n await this.handleReplyAction(post);\n executedActions.push(\"reply\");\n }\n\n if (post.id) {\n results.push({ postId: post.id, actionResponse, executedActions });\n }\n } catch (error) {\n logger.error(\n `Error processing actions for post ${post.id}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n return results;\n }\n\n private async ensurePostWorldContext(post: Post, _roomId: UUID, _worldId: UUID, _entityId: UUID) {\n try {\n // Use the utility function for consistency\n if (!post.userId || !post.username || !post.conversationId) {\n logger.warn(\"Cannot ensure context: missing required post fields\");\n return;\n }\n await ensureXContext(this.runtime, {\n userId: post.userId,\n username: post.username,\n name: post.name,\n conversationId: post.conversationId,\n });\n } catch (error) {\n logger.error(\n `Failed to ensure context for post ${post.id}:`,\n error instanceof Error ? error.message : String(error)\n );\n // Don't fail the entire timeline processing\n }\n }\n\n async handleLikeAction(post: Post) {\n try {\n if (this.isDryRun) {\n logger.log(`[DRY RUN] Would have liked post ${post.id}`);\n return;\n }\n if (!post.id) {\n logger.warn(\"Cannot like post: missing post ID\");\n return;\n }\n await this.xClient.likePost(post.id);\n logger.log(`Liked post ${post.id}`);\n } catch (error) {\n logger.error(\n `Error liking post ${post.id}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n async handleRepostAction(post: Post) {\n try {\n if (this.isDryRun) {\n logger.log(`[DRY RUN] Would have reposted post ${post.id}`);\n return;\n }\n if (!post.id) {\n logger.warn(\"Cannot repost: missing post ID\");\n return;\n }\n await this.xClient.repost(post.id);\n logger.log(`Reposted post ${post.id}`);\n } catch (error) {\n logger.error(\n `Error reposting post ${post.id}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n async handleQuoteAction(post: Post) {\n try {\n const message = this.formMessage(this.runtime, post);\n\n const state = await this.runtime.composeState(message);\n\n const quotePrompt =\n composePromptFromState({\n state,\n template: this.runtime.character.templates?.quotePostTemplate || quotePostTemplate,\n }) +\n `\nYou are responding to this post:\n${post.text}`;\n\n const quoteResponse = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: quotePrompt,\n });\n const responseObject = parseKeyValueXml(quoteResponse);\n\n const postText = responseObject?.post;\n if (postText && typeof postText === \"string\") {\n if (this.isDryRun) {\n logger.log(`[DRY RUN] Would have quoted post ${post.id} with: ${postText}`);\n return;\n }\n\n if (!post.id) {\n logger.error(\"Cannot send quote post: post.id is undefined\");\n return;\n }\n const postTextValue = postText; // Capture for closure\n const postIdValue = post.id; // Capture for closure\n const result = await this.client.requestQueue.add(\n async () => await this.xClient.sendQuotePost(postTextValue, postIdValue)\n );\n\n const body = (await result.json()) as {\n data?: {\n create_post?: { post_results?: { result?: { id?: string } } };\n };\n id?: string;\n };\n\n const postResult = body?.data?.create_post?.post_results?.result || body?.data || body;\n if (postResult) {\n logger.log(\"Successfully posted quote\");\n } else {\n logger.error(\"Quote post creation failed:\", body);\n }\n\n // Create memory for our response\n const postResultWithId = postResult as { id?: string };\n const postId = postResultWithId?.id || Date.now().toString();\n const responseId = createUniqueUuid(this.runtime, postId);\n const responseMemory: Memory = {\n id: responseId,\n entityId: this.runtime.agentId,\n agentId: this.runtime.agentId,\n roomId: message.roomId,\n content: {\n text: responseObject.post as string,\n inReplyTo: message.id,\n },\n createdAt: Date.now(),\n };\n\n // Save the response to memory with error handling\n await createMemorySafe(this.runtime, responseMemory, \"messages\");\n }\n } catch (error) {\n logger.error(\n \"Error in quote post generation:\",\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n async handleReplyAction(post: Post) {\n try {\n const message = this.formMessage(this.runtime, post);\n\n const state = await this.runtime.composeState(message);\n\n const replyPrompt =\n composePromptFromState({\n state,\n template: this.runtime.character.templates?.replyPostTemplate || replyPostTemplate,\n }) +\n `\nYou are replying to this post:\n${post.text}`;\n\n const replyResponse = await this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: replyPrompt,\n });\n const responseObject = parseKeyValueXml(replyResponse);\n\n if (responseObject?.post && typeof responseObject.post === \"string\") {\n if (this.isDryRun) {\n logger.log(\n `[DRY RUN] Would have replied to post ${post.id} with: ${responseObject.post}`\n );\n return;\n }\n\n const result = await sendPost(this.client, responseObject.post as string, [], post.id);\n\n if (result) {\n logger.log(\"Successfully posted reply\");\n\n // Create memory for our response\n const replyPostId = result.id || result.data?.id || Date.now().toString();\n const responseId = createUniqueUuid(this.runtime, replyPostId);\n const responseMemory: Memory = {\n id: responseId,\n entityId: this.runtime.agentId,\n agentId: this.runtime.agentId,\n roomId: message.roomId,\n content: {\n ...responseObject,\n inReplyTo: message.id,\n },\n createdAt: Date.now(),\n };\n\n // Save the response to memory with error handling\n await createMemorySafe(this.runtime, responseMemory, \"messages\");\n }\n }\n } catch (error) {\n logger.error(\n \"Error in reply generation:\",\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n}\n"
112
- ],
113
- "mappings": "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",
114
- "debugId": "651B3C444D11509C64756E2164756E21",
115
- "names": []
116
- }