@hasna/connectors 1.3.35 → 1.3.37

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 (49) hide show
  1. package/bin/index.js +154 -222
  2. package/bin/mcp.js +191 -268
  3. package/bin/serve.js +265 -342
  4. package/connectors/bluesky/README.md +34 -0
  5. package/connectors/bluesky/package.json +41 -0
  6. package/connectors/bluesky/src/api/client.test.ts +122 -0
  7. package/connectors/bluesky/src/api/client.ts +194 -0
  8. package/connectors/bluesky/src/api/index.ts +108 -0
  9. package/connectors/bluesky/src/index.ts +17 -0
  10. package/connectors/bluesky/src/types/index.ts +46 -0
  11. package/connectors/bluesky/tsconfig.json +16 -0
  12. package/connectors/x/src/api/media.ts +4 -3
  13. package/dashboard/dist/assets/index-ClBXkNbL.css +1 -0
  14. package/dashboard/dist/assets/index-DvfmyAO4.js +284 -0
  15. package/dashboard/dist/index.html +2 -2
  16. package/dist/.types/connectors/bluesky/src/api/client.d.ts +73 -0
  17. package/dist/.types/connectors/bluesky/src/api/index.d.ts +76 -0
  18. package/dist/.types/connectors/bluesky/src/index.d.ts +11 -0
  19. package/dist/.types/connectors/bluesky/src/types/index.d.ts +33 -0
  20. package/dist/.types/connectors/x/src/api/client.d.ts +96 -0
  21. package/dist/.types/connectors/x/src/api/index.d.ts +80 -0
  22. package/dist/.types/connectors/x/src/api/media.d.ts +54 -0
  23. package/dist/.types/connectors/x/src/api/oauth.d.ts +82 -0
  24. package/dist/.types/connectors/x/src/api/oauth1.d.ts +68 -0
  25. package/dist/.types/connectors/x/src/api/tweets.d.ts +175 -0
  26. package/dist/.types/connectors/x/src/api/users.d.ts +127 -0
  27. package/dist/.types/connectors/x/src/cli/index.d.ts +2 -0
  28. package/dist/.types/connectors/x/src/index.d.ts +6 -0
  29. package/dist/.types/connectors/x/src/types/index.d.ts +156 -0
  30. package/dist/.types/connectors/x/src/utils/config.d.ts +99 -0
  31. package/dist/.types/connectors/x/src/utils/output.d.ts +8 -0
  32. package/dist/.types/src/social/bluesky.d.ts +65 -0
  33. package/dist/.types/src/social/errors.d.ts +9 -0
  34. package/dist/.types/src/social/index.d.ts +16 -0
  35. package/dist/.types/src/social/mastodon.d.ts +32 -0
  36. package/dist/.types/src/social/types.d.ts +73 -0
  37. package/dist/.types/src/social/util.d.ts +5 -0
  38. package/dist/.types/src/social/x.d.ts +82 -0
  39. package/dist/cli/components/App.d.ts +1 -2
  40. package/dist/cli/components/CategorySelect.d.ts +1 -2
  41. package/dist/cli/components/ConnectorSelect.d.ts +1 -2
  42. package/dist/cli/components/Header.d.ts +1 -2
  43. package/dist/cli/components/InstallProgress.d.ts +1 -2
  44. package/dist/cli/components/SearchView.d.ts +1 -2
  45. package/dist/index.js +123 -110
  46. package/dist/social/index.js +1531 -0
  47. package/package.json +8 -4
  48. package/dashboard/dist/assets/index-DJjxFlTl.css +0 -1
  49. package/dashboard/dist/assets/index-DNPZ58_i.js +0 -284
@@ -0,0 +1,32 @@
1
+ import type { AccountMeResult, AnalyticsPostInput, AnalyticsPostResult, MediaUploadInput, MentionsListInput, MentionsListResult, PostCreateInput, PostCreateResult, PostDeleteInput, PostDeleteResult, SocialAdapter } from "./types";
2
+ /** Injectable fetch so tests can mock the network. */
3
+ export type FetchLike = (input: string, init?: {
4
+ method?: string;
5
+ headers?: Record<string, string>;
6
+ body?: unknown;
7
+ }) => Promise<{
8
+ ok: boolean;
9
+ status: number;
10
+ statusText?: string;
11
+ text(): Promise<string>;
12
+ }>;
13
+ export interface MastodonCredentials {
14
+ accessToken: string;
15
+ baseUrl: string;
16
+ }
17
+ export declare class MastodonAdapter implements SocialAdapter {
18
+ private readonly accessToken;
19
+ private readonly baseUrl;
20
+ private readonly fetchImpl;
21
+ constructor(creds: MastodonCredentials, fetchImpl?: FetchLike);
22
+ static fromCredentials(creds: MastodonCredentials, fetchImpl?: FetchLike): MastodonAdapter;
23
+ private call;
24
+ accountMe(): Promise<AccountMeResult>;
25
+ postCreate(input: PostCreateInput): Promise<PostCreateResult>;
26
+ postDelete(input: PostDeleteInput): Promise<PostDeleteResult>;
27
+ mediaUpload(input: MediaUploadInput): Promise<{
28
+ mediaId: string;
29
+ }>;
30
+ mentionsList(input?: MentionsListInput): Promise<MentionsListResult>;
31
+ analyticsPost(input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
32
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Normalized, network-agnostic types for the stateless social transport SDK.
3
+ *
4
+ * These types are intentionally self-contained: the public `@hasna/connectors/social`
5
+ * surface must NOT leak connector-internal types. Everything here is plain data so the
6
+ * entry point stays bundle-safe (no fs/db/runner imports).
7
+ */
8
+ /** Slugs supported by this deliverable. */
9
+ export type SocialConnectorSlug = "x" | "mastodon" | "bluesky";
10
+ /** Normalized operation names. */
11
+ export type SocialOperation = "account.me" | "post.create" | "post.delete" | "media.upload" | "mentions.list" | "analytics.post";
12
+ export interface AccountMeResult {
13
+ id: string;
14
+ username?: string;
15
+ displayName?: string;
16
+ url?: string;
17
+ }
18
+ export interface PostCreateInput {
19
+ text: string;
20
+ replyToId?: string;
21
+ mediaIds?: string[];
22
+ }
23
+ export interface PostCreateResult {
24
+ id: string;
25
+ url?: string;
26
+ }
27
+ export interface PostDeleteInput {
28
+ id: string;
29
+ }
30
+ export interface PostDeleteResult {
31
+ id: string;
32
+ deleted: boolean;
33
+ }
34
+ export interface MediaUploadInput {
35
+ dataBase64: string;
36
+ mimeType: string;
37
+ altText?: string;
38
+ }
39
+ export interface MediaUploadResult {
40
+ mediaId: string;
41
+ }
42
+ export interface MentionsListInput {
43
+ sinceId?: string;
44
+ limit?: number;
45
+ }
46
+ export interface MentionItem {
47
+ id: string;
48
+ text: string;
49
+ authorId?: string;
50
+ authorHandle?: string;
51
+ createdAt?: string;
52
+ }
53
+ export interface MentionsListResult {
54
+ items: MentionItem[];
55
+ }
56
+ export interface AnalyticsPostInput {
57
+ id: string;
58
+ }
59
+ export interface AnalyticsPostResult {
60
+ metrics: Record<string, number>;
61
+ }
62
+ /**
63
+ * A connector adapter: maps each normalized operation onto a network's transport.
64
+ * Credentials are caller-owned and passed in per construction — no local storage.
65
+ */
66
+ export interface SocialAdapter {
67
+ accountMe(input?: Record<string, unknown>): Promise<AccountMeResult>;
68
+ postCreate(input: PostCreateInput): Promise<PostCreateResult>;
69
+ postDelete(input: PostDeleteInput): Promise<PostDeleteResult>;
70
+ mediaUpload(input: MediaUploadInput): Promise<MediaUploadResult>;
71
+ mentionsList(input?: MentionsListInput): Promise<MentionsListResult>;
72
+ analyticsPost(input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
73
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Decode a base64 string into a Buffer. Uses the global `Buffer` (available in
3
+ * Bun and Node) — no `node:fs`, so this stays bundle-safe.
4
+ */
5
+ export declare function decodeBase64(dataBase64: string): Buffer;
@@ -0,0 +1,82 @@
1
+ import type { AccountMeResult, AnalyticsPostInput, AnalyticsPostResult, MediaUploadInput, MediaUploadResult, MentionsListInput, MentionsListResult, PostCreateInput, PostCreateResult, PostDeleteInput, PostDeleteResult, SocialAdapter } from "./types";
2
+ /** Minimal structural type for the X transport so tests can inject a mock. */
3
+ export interface XTransport {
4
+ tweets: {
5
+ create(opts: {
6
+ text: string;
7
+ replyToTweetId?: string;
8
+ mediaIds?: string[];
9
+ }): Promise<{
10
+ data: {
11
+ id: string;
12
+ text: string;
13
+ };
14
+ }>;
15
+ delete(id: string): Promise<{
16
+ data: {
17
+ deleted: boolean;
18
+ };
19
+ }>;
20
+ get(id: string, options?: unknown): Promise<{
21
+ data: {
22
+ id: string;
23
+ public_metrics?: Record<string, number>;
24
+ };
25
+ }>;
26
+ getUserMentions(userId: string, options?: unknown): Promise<{
27
+ data: Array<{
28
+ id: string;
29
+ text: string;
30
+ author_id?: string;
31
+ created_at?: string;
32
+ }>;
33
+ includes?: {
34
+ users?: Array<{
35
+ id: string;
36
+ username: string;
37
+ }>;
38
+ };
39
+ }>;
40
+ };
41
+ users: {
42
+ me(): Promise<{
43
+ data: {
44
+ id: string;
45
+ username: string;
46
+ name?: string;
47
+ };
48
+ }>;
49
+ };
50
+ media?: {
51
+ uploadBuffer(data: Buffer, mimeType: string, options?: {
52
+ altText?: string;
53
+ }): Promise<{
54
+ media_id_string: string;
55
+ }>;
56
+ };
57
+ }
58
+ export interface XCredentials {
59
+ apiKey: string;
60
+ apiSecret: string;
61
+ accessToken?: string;
62
+ refreshToken?: string;
63
+ bearerToken?: string;
64
+ oauth1AccessToken?: string;
65
+ oauth1AccessTokenSecret?: string;
66
+ clientId?: string;
67
+ clientSecret?: string;
68
+ }
69
+ export declare class XAdapter implements SocialAdapter {
70
+ private readonly x;
71
+ /** Cached authenticated user (id + username) to build URLs / mentions. */
72
+ private me?;
73
+ constructor(x: XTransport);
74
+ static fromCredentials(creds: XCredentials): XAdapter;
75
+ private resolveMe;
76
+ accountMe(): Promise<AccountMeResult>;
77
+ postCreate(input: PostCreateInput): Promise<PostCreateResult>;
78
+ postDelete(input: PostDeleteInput): Promise<PostDeleteResult>;
79
+ mediaUpload(input: MediaUploadInput): Promise<MediaUploadResult>;
80
+ mentionsList(input?: MentionsListInput): Promise<MentionsListResult>;
81
+ analyticsPost(input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
82
+ }
@@ -1,7 +1,6 @@
1
- import React from "react";
2
1
  interface AppProps {
3
2
  initialConnectors?: string[];
4
3
  overwrite?: boolean;
5
4
  }
6
- export declare function App({ initialConnectors, overwrite }: AppProps): React.JSX.Element;
5
+ export declare function App({ initialConnectors, overwrite }: AppProps): import("react/jsx-runtime").JSX.Element;
7
6
  export {};
@@ -1,7 +1,6 @@
1
- import React from "react";
2
1
  interface CategorySelectProps {
3
2
  onSelect: (category: string) => void;
4
3
  onBack?: () => void;
5
4
  }
6
- export declare function CategorySelect({ onSelect, onBack }: CategorySelectProps): React.JSX.Element;
5
+ export declare function CategorySelect({ onSelect, onBack }: CategorySelectProps): import("react/jsx-runtime").JSX.Element;
7
6
  export {};
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { ConnectorMeta } from "../../lib/registry.js";
3
2
  interface ConnectorSelectProps {
4
3
  connectors: ConnectorMeta[];
@@ -7,5 +6,5 @@ interface ConnectorSelectProps {
7
6
  onConfirm: () => void;
8
7
  onBack: () => void;
9
8
  }
10
- export declare function ConnectorSelect({ connectors, selected, onToggle, onConfirm, onBack, }: ConnectorSelectProps): React.JSX.Element;
9
+ export declare function ConnectorSelect({ connectors, selected, onToggle, onConfirm, onBack, }: ConnectorSelectProps): import("react/jsx-runtime").JSX.Element;
11
10
  export {};
@@ -1,7 +1,6 @@
1
- import React from "react";
2
1
  interface HeaderProps {
3
2
  title?: string;
4
3
  subtitle?: string;
5
4
  }
6
- export declare function Header({ title, subtitle }: HeaderProps): React.JSX.Element;
5
+ export declare function Header({ title, subtitle }: HeaderProps): import("react/jsx-runtime").JSX.Element;
7
6
  export {};
@@ -1,9 +1,8 @@
1
- import React from "react";
2
1
  import { InstallResult } from "../../lib/installer.js";
3
2
  interface InstallProgressProps {
4
3
  connectors: string[];
5
4
  overwrite?: boolean;
6
5
  onComplete: (results: InstallResult[]) => void;
7
6
  }
8
- export declare function InstallProgress({ connectors, overwrite, onComplete, }: InstallProgressProps): React.JSX.Element;
7
+ export declare function InstallProgress({ connectors, overwrite, onComplete, }: InstallProgressProps): import("react/jsx-runtime").JSX.Element;
9
8
  export {};
@@ -1,9 +1,8 @@
1
- import React from "react";
2
1
  interface SearchViewProps {
3
2
  selected: Set<string>;
4
3
  onToggle: (name: string) => void;
5
4
  onConfirm: () => void;
6
5
  onBack: () => void;
7
6
  }
8
- export declare function SearchView({ selected, onToggle, onConfirm, onBack, }: SearchViewProps): React.JSX.Element;
7
+ export declare function SearchView({ selected, onToggle, onConfirm, onBack, }: SearchViewProps): import("react/jsx-runtime").JSX.Element;
9
8
  export {};