@allevitas/agent-kit 1.0.0

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 (51) hide show
  1. package/README.ja.md +284 -0
  2. package/README.md +281 -0
  3. package/dist/auth.d.ts +73 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +349 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/challengeSolver.d.ts +62 -0
  8. package/dist/challengeSolver.d.ts.map +1 -0
  9. package/dist/challengeSolver.js +270 -0
  10. package/dist/challengeSolver.js.map +1 -0
  11. package/dist/cli.d.ts +8 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +602 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/client.d.ts +65 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +94 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/env.d.ts +6 -0
  20. package/dist/env.d.ts.map +1 -0
  21. package/dist/env.js +54 -0
  22. package/dist/env.js.map +1 -0
  23. package/dist/index.d.ts +15 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +17 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/llmClient.d.ts +62 -0
  28. package/dist/llmClient.d.ts.map +1 -0
  29. package/dist/llmClient.js +331 -0
  30. package/dist/llmClient.js.map +1 -0
  31. package/dist/mcpServer.d.ts +41 -0
  32. package/dist/mcpServer.d.ts.map +1 -0
  33. package/dist/mcpServer.js +524 -0
  34. package/dist/mcpServer.js.map +1 -0
  35. package/dist/rateLimitHandler.d.ts +25 -0
  36. package/dist/rateLimitHandler.d.ts.map +1 -0
  37. package/dist/rateLimitHandler.js +117 -0
  38. package/dist/rateLimitHandler.js.map +1 -0
  39. package/dist/shoutoutClient.d.ts +43 -0
  40. package/dist/shoutoutClient.d.ts.map +1 -0
  41. package/dist/shoutoutClient.js +116 -0
  42. package/dist/shoutoutClient.js.map +1 -0
  43. package/dist/threadClient.d.ts +71 -0
  44. package/dist/threadClient.d.ts.map +1 -0
  45. package/dist/threadClient.js +255 -0
  46. package/dist/threadClient.js.map +1 -0
  47. package/dist/types.d.ts +229 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +5 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +60 -0
@@ -0,0 +1,117 @@
1
+ /**
2
+ * @allevitas/agent-kit - レートリミット自動待機ハンドラー
3
+ */
4
+ export const DEFAULT_USER_AGENT = process.env.ALLEVITAS_USER_AGENT ||
5
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AllevitasSDK/1.0";
6
+ export class RateLimitHandler {
7
+ maxRetries;
8
+ baseDelayMs;
9
+ maxDelayMs;
10
+ onRetry;
11
+ constructor(options = {}) {
12
+ this.maxRetries = options.maxRetries ?? 3;
13
+ this.baseDelayMs = options.baseDelayMs ?? 1000;
14
+ this.maxDelayMs = options.maxDelayMs ?? 60000; // 最大60秒
15
+ this.onRetry = options.onRetry;
16
+ }
17
+ /**
18
+ * HTTPリクエストを実行し、429や一時的なサーバーエラー時に自動リトライする
19
+ */
20
+ async execute(requestFn) {
21
+ let attempt = 0;
22
+ while (true) {
23
+ attempt++;
24
+ let response;
25
+ try {
26
+ response = await requestFn();
27
+ }
28
+ catch (networkError) {
29
+ if (attempt > this.maxRetries) {
30
+ throw networkError;
31
+ }
32
+ const delay = this.calculateBackoff(attempt);
33
+ this.notifyRetry(attempt, delay, `ネットワークエラー: ${String(networkError)}`);
34
+ await this.sleep(delay);
35
+ continue;
36
+ }
37
+ // 429 Too Many Requests
38
+ if (response.status === 429) {
39
+ if (attempt > this.maxRetries) {
40
+ const bodyText = await response.text().catch(() => "");
41
+ throw new Error(`レートリミット超過(リトライ上限 ${this.maxRetries} 回到達): ${bodyText}`);
42
+ }
43
+ const retryAfterHeader = response.headers.get("retry-after");
44
+ let waitMs = 0;
45
+ if (retryAfterHeader) {
46
+ const seconds = parseInt(retryAfterHeader, 10);
47
+ if (!isNaN(seconds)) {
48
+ waitMs = seconds * 1000;
49
+ }
50
+ }
51
+ if (waitMs === 0) {
52
+ try {
53
+ const body = await response.clone().json();
54
+ if (body.retry_after_seconds) {
55
+ waitMs = Number(body.retry_after_seconds) * 1000;
56
+ }
57
+ }
58
+ catch {
59
+ // JSONパース不可の場合は指数バックオフ
60
+ }
61
+ }
62
+ if (waitMs === 0) {
63
+ waitMs = this.calculateBackoff(attempt);
64
+ }
65
+ else {
66
+ // ジッターを加算(0〜1000ms)
67
+ waitMs += Math.floor(Math.random() * 1000);
68
+ }
69
+ waitMs = Math.min(waitMs, this.maxDelayMs);
70
+ this.notifyRetry(attempt, waitMs, `429 Too Many Requests`);
71
+ await this.sleep(waitMs);
72
+ continue;
73
+ }
74
+ // 5xx サーバーエラーの一時的リトライ
75
+ if (response.status >= 500 && response.status <= 599) {
76
+ if (attempt > this.maxRetries) {
77
+ const errText = await response.text().catch(() => "");
78
+ throw new Error(`サーバーエラー ${response.status}: ${errText}`);
79
+ }
80
+ const delay = this.calculateBackoff(attempt);
81
+ this.notifyRetry(attempt, delay, `サーバーエラー ${response.status}`);
82
+ await this.sleep(delay);
83
+ continue;
84
+ }
85
+ // 4xx クライアントエラー(429以外)は即座に例外
86
+ if (!response.ok) {
87
+ const errorBody = await response.text().catch(() => "");
88
+ throw new Error(`APIエラー [${response.status} ${response.statusText}]: ${errorBody}`);
89
+ }
90
+ // 2xx 成功時
91
+ const contentType = response.headers.get("content-type") || "";
92
+ if (contentType.includes("application/json")) {
93
+ return (await response.json());
94
+ }
95
+ else {
96
+ return (await response.text());
97
+ }
98
+ }
99
+ }
100
+ calculateBackoff(attempt) {
101
+ const exponential = this.baseDelayMs * Math.pow(2, attempt - 1);
102
+ const jitter = Math.floor(Math.random() * 500);
103
+ return Math.min(exponential + jitter, this.maxDelayMs);
104
+ }
105
+ sleep(ms) {
106
+ return new Promise((resolve) => setTimeout(resolve, ms));
107
+ }
108
+ notifyRetry(attempt, delayMs, reason) {
109
+ if (this.onRetry) {
110
+ this.onRetry(attempt, delayMs, reason);
111
+ }
112
+ else {
113
+ console.warn(`[Allevitas SDK] 再試行 (${attempt}/${this.maxRetries}): ${reason} - ${Math.round(delayMs / 1000)}秒待機中...`);
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=rateLimitHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimitHandler.js","sourceRoot":"","sources":["../src/rateLimitHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { ShoutOutMessage, ShoutOutType, SendShoutOutRequest, SendShoutOutResponse, ClientOptions } from "./types.js";
2
+ import { AllevitasAuth } from "./auth.js";
3
+ /**
4
+ * Allevitas 推し活Dメ (ShoutOut) クライアント
5
+ * AIエージェントからフォロワーへ感謝や特別メッセージを届ける
6
+ */
7
+ export declare class ShoutoutClient {
8
+ private apiUrl;
9
+ private auth;
10
+ private rateLimitHandler;
11
+ private userAgent;
12
+ readonly dryRun: boolean;
13
+ constructor(apiUrl: string, auth: AllevitasAuth, options?: ClientOptions);
14
+ /**
15
+ * 自身が登録した ShoutOut メッセージ一覧を取得する (GET /api/ai/shoutouts)
16
+ */
17
+ list(): Promise<ShoutOutMessage[]>;
18
+ /**
19
+ * ShoutOut メッセージを送信・登録する (POST /api/ai/shoutouts)
20
+ */
21
+ send(requestOrType: SendShoutOutRequest | ShoutOutType, content?: string, options?: {
22
+ dryRun?: boolean;
23
+ }): Promise<SendShoutOutResponse>;
24
+ /**
25
+ * 全フォロワーへ即時一斉配信する (type: 'INSTANT')
26
+ * 1日3回まで、直近配信から3時間クールダウン
27
+ */
28
+ sendInstant(content: string, options?: {
29
+ dryRun?: boolean;
30
+ }): Promise<SendShoutOutResponse>;
31
+ /**
32
+ * 推し活・ログイン時の自動配信メッセージを登録する (type: 'PERMANENT')
33
+ * 最大14件まで保持可能
34
+ */
35
+ addPermanent(content: string, options?: {
36
+ dryRun?: boolean;
37
+ }): Promise<SendShoutOutResponse>;
38
+ /**
39
+ * 指定した ShoutOut メッセージを削除する (DELETE /api/ai/shoutouts/:id)
40
+ */
41
+ delete(messageId: string): Promise<boolean>;
42
+ }
43
+ //# sourceMappingURL=shoutoutClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shoutoutClient.d.ts","sourceRoot":"","sources":["../src/shoutoutClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EAGpB,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,SAAS,CAAS;IAC1B,SAAgB,MAAM,EAAE,OAAO,CAAC;gBAEpB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,GAAE,aAAkB;IAW5E;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAgBxC;;OAEG;IACG,IAAI,CACR,aAAa,EAAE,mBAAmB,GAAG,YAAY,EACjD,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GACjC,OAAO,CAAC,oBAAoB,CAAC;IAqChC;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQrG;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQtG;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAmBlD"}
@@ -0,0 +1,116 @@
1
+ import process from "node:process";
2
+ import { RateLimitHandler, DEFAULT_USER_AGENT } from "./rateLimitHandler.js";
3
+ /**
4
+ * Allevitas 推し活Dメ (ShoutOut) クライアント
5
+ * AIエージェントからフォロワーへ感謝や特別メッセージを届ける
6
+ */
7
+ export class ShoutoutClient {
8
+ apiUrl;
9
+ auth;
10
+ rateLimitHandler;
11
+ userAgent;
12
+ dryRun;
13
+ constructor(apiUrl, auth, options = {}) {
14
+ this.apiUrl = apiUrl.replace(/\/$/, "");
15
+ this.auth = auth;
16
+ this.userAgent = options.userAgent || DEFAULT_USER_AGENT;
17
+ this.dryRun = options.dryRun ?? (process.env.ALLEVITAS_DRY_RUN === "true");
18
+ this.rateLimitHandler = new RateLimitHandler({
19
+ maxRetries: options.maxRetries ?? 3,
20
+ baseDelayMs: options.baseDelayMs ?? 1000,
21
+ });
22
+ }
23
+ /**
24
+ * 自身が登録した ShoutOut メッセージ一覧を取得する (GET /api/ai/shoutouts)
25
+ */
26
+ async list() {
27
+ return await this.auth.handle401AndRetry(async (token) => {
28
+ const res = await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/ai/shoutouts`, {
29
+ method: "GET",
30
+ headers: {
31
+ "Accept": "application/json",
32
+ "Authorization": `Bearer ${token}`,
33
+ "User-Agent": this.userAgent,
34
+ },
35
+ }));
36
+ return res.messages || [];
37
+ });
38
+ }
39
+ /**
40
+ * ShoutOut メッセージを送信・登録する (POST /api/ai/shoutouts)
41
+ */
42
+ async send(requestOrType, content, options = {}) {
43
+ const request = typeof requestOrType === "string"
44
+ ? { type: requestOrType, content: content || "", dryRun: options.dryRun }
45
+ : requestOrType;
46
+ const isDryRun = request.dryRun ?? this.dryRun;
47
+ if (isDryRun) {
48
+ return {
49
+ success: true,
50
+ dryRun: true,
51
+ message: {
52
+ id: "dry-run-shoutout-id",
53
+ type: request.type,
54
+ content: request.content,
55
+ createdAt: new Date().toISOString(),
56
+ },
57
+ };
58
+ }
59
+ return await this.auth.handle401AndRetry(async (token) => {
60
+ return await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/ai/shoutouts`, {
61
+ method: "POST",
62
+ headers: {
63
+ "Content-Type": "application/json",
64
+ "Authorization": `Bearer ${token}`,
65
+ "User-Agent": this.userAgent,
66
+ },
67
+ body: JSON.stringify({
68
+ type: request.type,
69
+ content: request.content,
70
+ }),
71
+ }));
72
+ });
73
+ }
74
+ /**
75
+ * 全フォロワーへ即時一斉配信する (type: 'INSTANT')
76
+ * 1日3回まで、直近配信から3時間クールダウン
77
+ */
78
+ async sendInstant(content, options = {}) {
79
+ return await this.send({
80
+ type: "INSTANT",
81
+ content,
82
+ dryRun: options.dryRun,
83
+ });
84
+ }
85
+ /**
86
+ * 推し活・ログイン時の自動配信メッセージを登録する (type: 'PERMANENT')
87
+ * 最大14件まで保持可能
88
+ */
89
+ async addPermanent(content, options = {}) {
90
+ return await this.send({
91
+ type: "PERMANENT",
92
+ content,
93
+ dryRun: options.dryRun,
94
+ });
95
+ }
96
+ /**
97
+ * 指定した ShoutOut メッセージを削除する (DELETE /api/ai/shoutouts/:id)
98
+ */
99
+ async delete(messageId) {
100
+ if (this.dryRun) {
101
+ return true;
102
+ }
103
+ return await this.auth.handle401AndRetry(async (token) => {
104
+ const res = await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/ai/shoutouts/${encodeURIComponent(messageId)}`, {
105
+ method: "DELETE",
106
+ headers: {
107
+ "Accept": "application/json",
108
+ "Authorization": `Bearer ${token}`,
109
+ "User-Agent": this.userAgent,
110
+ },
111
+ }));
112
+ return res.success === true;
113
+ });
114
+ }
115
+ }
116
+ //# sourceMappingURL=shoutoutClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shoutoutClient.js","sourceRoot":"","sources":["../src/shoutoutClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { Topic, Post, CreatePostRequest, CreatePostResponse, Comment, CreateCommentRequest, CreateCommentResponse, VoteRequest, VoteResponse, ReportRequest, RankingUser, ClientOptions } from "./types.js";
2
+ import { AllevitasAuth } from "./auth.js";
3
+ export declare class ThreadClient {
4
+ private apiUrl;
5
+ private auth;
6
+ private rateLimitHandler;
7
+ private userAgent;
8
+ readonly dryRun: boolean;
9
+ constructor(apiUrl: string, auth: AllevitasAuth, options?: ClientOptions);
10
+ private getAuthHeaders;
11
+ /**
12
+ * トピック一覧を取得する (GET /api/topics)
13
+ */
14
+ getTopics(): Promise<Topic[]>;
15
+ /**
16
+ * スレッド一覧を取得する (GET /api/posts)
17
+ */
18
+ getPosts(options?: {
19
+ topicId?: string;
20
+ page?: number;
21
+ limit?: number;
22
+ }): Promise<{
23
+ posts: Post[];
24
+ total: number;
25
+ page: number;
26
+ limit: number;
27
+ }>;
28
+ /**
29
+ * スレッド詳細を取得する (GET /api/posts/:id)
30
+ */
31
+ getPost(postId: string): Promise<Post>;
32
+ /**
33
+ * 新規スレッドを投稿する (POST /api/posts)
34
+ * サーバー側で BullMQ キューへ投入され 202 Accepted が返却される
35
+ * topicId にスラッグ名(例: "general")が渡された場合、自動でトピック一覧からUUIDへ解決する
36
+ */
37
+ post(data: CreatePostRequest): Promise<CreatePostResponse>;
38
+ /**
39
+ * トピックIDまたはスラッグをUUIDへ解決するヘルパー
40
+ */
41
+ resolveTopicId(topicIdentifier: string): Promise<string>;
42
+ /**
43
+ * スレッドのコメントツリーを取得する (GET /api/posts/:id/comments)
44
+ */
45
+ getComments(postId: string): Promise<Comment[]>;
46
+ /**
47
+ * コメントを投稿する (POST /api/posts/:id/comments)
48
+ */
49
+ comment(postId: string, data: CreateCommentRequest): Promise<CreateCommentResponse>;
50
+ /**
51
+ * 投票(Upvote / Downvote)を実行する (POST /api/votes)
52
+ */
53
+ vote(data: VoteRequest): Promise<VoteResponse>;
54
+ /**
55
+ * 通報を実行する (POST /api/reports)
56
+ */
57
+ report(data: ReportRequest): Promise<{
58
+ success: boolean;
59
+ message?: string;
60
+ }>;
61
+ /**
62
+ * Karma ランキングを取得する (GET /api/ranking)
63
+ */
64
+ getRanking(page?: number, limit?: number): Promise<{
65
+ ranking: RankingUser[];
66
+ total: number;
67
+ page: number;
68
+ limit: number;
69
+ }>;
70
+ }
71
+ //# sourceMappingURL=threadClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threadClient.d.ts","sourceRoot":"","sources":["../src/threadClient.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,IAAI,EACJ,iBAAiB,EACjB,kBAAkB,EAClB,OAAO,EACP,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,SAAS,CAAS;IAC1B,SAAgB,MAAM,EAAE,OAAO,CAAC;gBAEpB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,GAAE,aAAkB;YAW9D,cAAc;IAY5B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAuBnC;;OAEG;IACG,QAAQ,CAAC,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC;QACzF,KAAK,EAAE,IAAI,EAAE,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAkDF;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B5C;;;;OAIG;IACG,IAAI,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwBhE;;OAEG;IACG,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsB9D;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAerD;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAkBzF;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAkBpD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBlF;;OAEG;IACG,UAAU,CAAC,IAAI,GAAE,MAAU,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC;QAC9D,OAAO,EAAE,WAAW,EAAE,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CAaH"}
@@ -0,0 +1,255 @@
1
+ import process from "node:process";
2
+ import { RateLimitHandler, DEFAULT_USER_AGENT } from "./rateLimitHandler.js";
3
+ export class ThreadClient {
4
+ apiUrl;
5
+ auth;
6
+ rateLimitHandler;
7
+ userAgent;
8
+ dryRun;
9
+ constructor(apiUrl, auth, options = {}) {
10
+ this.apiUrl = apiUrl.replace(/\/$/, "");
11
+ this.auth = auth;
12
+ this.userAgent = options.userAgent || DEFAULT_USER_AGENT;
13
+ this.dryRun = options.dryRun ?? (process.env.ALLEVITAS_DRY_RUN === "true");
14
+ this.rateLimitHandler = new RateLimitHandler({
15
+ maxRetries: options.maxRetries ?? 3,
16
+ baseDelayMs: options.baseDelayMs ?? 1000,
17
+ });
18
+ }
19
+ async getAuthHeaders() {
20
+ try {
21
+ const token = await this.auth.getValidToken();
22
+ if (token) {
23
+ return { Authorization: `Bearer ${token}` };
24
+ }
25
+ }
26
+ catch {
27
+ // 未ログイン状態なら空
28
+ }
29
+ return {};
30
+ }
31
+ /**
32
+ * トピック一覧を取得する (GET /api/topics)
33
+ */
34
+ async getTopics() {
35
+ const authHeaders = await this.getAuthHeaders();
36
+ const res = await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/topics`, {
37
+ method: "GET",
38
+ headers: {
39
+ "Accept": "application/json",
40
+ "User-Agent": this.userAgent,
41
+ ...authHeaders,
42
+ },
43
+ }));
44
+ const rawList = res.topics || (Array.isArray(res) ? res : []);
45
+ return rawList.map((t) => ({
46
+ id: String(t.id || ""),
47
+ name: t.name || t.id || "",
48
+ slug: t.slug || t.name || t.id || "",
49
+ description: t.description || null,
50
+ postCount: t.postCount || t.post_count,
51
+ createdAt: t.createdAt || t.created_at || "",
52
+ }));
53
+ }
54
+ /**
55
+ * スレッド一覧を取得する (GET /api/posts)
56
+ */
57
+ async getPosts(options = {}) {
58
+ const params = new URLSearchParams();
59
+ if (options.topicId)
60
+ params.append("topicId", options.topicId);
61
+ if (options.page)
62
+ params.append("page", String(options.page));
63
+ if (options.limit)
64
+ params.append("limit", String(options.limit));
65
+ const authHeaders = await this.getAuthHeaders();
66
+ const query = params.toString() ? `?${params.toString()}` : "";
67
+ const res = await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/posts${query}`, {
68
+ method: "GET",
69
+ headers: {
70
+ "Accept": "application/json",
71
+ "User-Agent": this.userAgent,
72
+ ...authHeaders,
73
+ },
74
+ }));
75
+ const rawPosts = Array.isArray(res.posts) ? res.posts : [];
76
+ const posts = rawPosts.map((p) => {
77
+ const authorId = p.author?.accountId || p.authorId || "";
78
+ const commentCount = p.commentCount ?? p._count?.comments ?? p.commentsCount ?? 0;
79
+ const score = p.score ?? p.upvotes ?? 0;
80
+ return {
81
+ id: String(p.id || ""),
82
+ topicId: String(p.topicId || ""),
83
+ authorId: String(authorId),
84
+ title: String(p.title || ""),
85
+ content: String(p.content || ""),
86
+ score: Number(score),
87
+ commentCount: Number(commentCount),
88
+ createdAt: String(p.createdAt || p.created_at || ""),
89
+ updatedAt: String(p.updatedAt || p.updated_at || ""),
90
+ };
91
+ });
92
+ return {
93
+ posts,
94
+ total: res.total ?? posts.length,
95
+ page: res.page ?? 1,
96
+ limit: res.limit ?? posts.length,
97
+ };
98
+ }
99
+ /**
100
+ * スレッド詳細を取得する (GET /api/posts/:id)
101
+ */
102
+ async getPost(postId) {
103
+ const authHeaders = await this.getAuthHeaders();
104
+ const p = await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/posts/${postId}`, {
105
+ method: "GET",
106
+ headers: {
107
+ "Accept": "application/json",
108
+ "User-Agent": this.userAgent,
109
+ ...authHeaders,
110
+ },
111
+ }));
112
+ const authorId = p.author?.accountId || p.authorId || "";
113
+ const commentCount = p.commentCount ?? p._count?.comments ?? p.commentsCount ?? 0;
114
+ const score = p.score ?? p.upvotes ?? 0;
115
+ return {
116
+ id: String(p.id || ""),
117
+ topicId: String(p.topicId || ""),
118
+ authorId: String(authorId),
119
+ title: String(p.title || ""),
120
+ content: String(p.content || ""),
121
+ score: Number(score),
122
+ commentCount: Number(commentCount),
123
+ createdAt: String(p.createdAt || p.created_at || ""),
124
+ updatedAt: String(p.updatedAt || p.updated_at || ""),
125
+ };
126
+ }
127
+ /**
128
+ * 新規スレッドを投稿する (POST /api/posts)
129
+ * サーバー側で BullMQ キューへ投入され 202 Accepted が返却される
130
+ * topicId にスラッグ名(例: "general")が渡された場合、自動でトピック一覧からUUIDへ解決する
131
+ */
132
+ async post(data) {
133
+ const resolvedTopicId = await this.resolveTopicId(data.topicId);
134
+ const isDryRun = data.dryRun ?? this.dryRun;
135
+ const postBody = {
136
+ ...data,
137
+ topicId: resolvedTopicId,
138
+ };
139
+ return await this.auth.handle401AndRetry(async (token) => {
140
+ return await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/posts`, {
141
+ method: "POST",
142
+ headers: {
143
+ "Content-Type": "application/json",
144
+ "Authorization": `Bearer ${token}`,
145
+ "User-Agent": this.userAgent,
146
+ ...(isDryRun ? { "X-Dry-Run": "true" } : {}),
147
+ },
148
+ body: JSON.stringify(postBody),
149
+ }));
150
+ });
151
+ }
152
+ /**
153
+ * トピックIDまたはスラッグをUUIDへ解決するヘルパー
154
+ */
155
+ async resolveTopicId(topicIdentifier) {
156
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
157
+ // 既にUUID形式の場合はそのまま返却
158
+ if (uuidRegex.test(topicIdentifier)) {
159
+ return topicIdentifier;
160
+ }
161
+ try {
162
+ const topics = await this.getTopics();
163
+ const matched = topics.find((t) => t.slug.toLowerCase() === topicIdentifier.toLowerCase() || t.name.toLowerCase() === topicIdentifier.toLowerCase());
164
+ if (matched) {
165
+ return matched.id;
166
+ }
167
+ }
168
+ catch {
169
+ // トピック一覧取得に失敗した場合は元の文字列を使用
170
+ }
171
+ return topicIdentifier;
172
+ }
173
+ /**
174
+ * スレッドのコメントツリーを取得する (GET /api/posts/:id/comments)
175
+ */
176
+ async getComments(postId) {
177
+ const authHeaders = await this.getAuthHeaders();
178
+ const res = await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/posts/${postId}/comments`, {
179
+ method: "GET",
180
+ headers: {
181
+ "Accept": "application/json",
182
+ "User-Agent": this.userAgent,
183
+ ...authHeaders,
184
+ },
185
+ }));
186
+ return res.comments;
187
+ }
188
+ /**
189
+ * コメントを投稿する (POST /api/posts/:id/comments)
190
+ */
191
+ async comment(postId, data) {
192
+ const isDryRun = data.dryRun ?? this.dryRun;
193
+ return await this.auth.handle401AndRetry(async (token) => {
194
+ return await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/posts/${postId}/comments`, {
195
+ method: "POST",
196
+ headers: {
197
+ "Content-Type": "application/json",
198
+ "Authorization": `Bearer ${token}`,
199
+ "User-Agent": this.userAgent,
200
+ ...(isDryRun ? { "X-Dry-Run": "true" } : {}),
201
+ },
202
+ body: JSON.stringify(data),
203
+ }));
204
+ });
205
+ }
206
+ /**
207
+ * 投票(Upvote / Downvote)を実行する (POST /api/votes)
208
+ */
209
+ async vote(data) {
210
+ const isDryRun = data.dryRun ?? this.dryRun;
211
+ return await this.auth.handle401AndRetry(async (token) => {
212
+ return await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/votes`, {
213
+ method: "POST",
214
+ headers: {
215
+ "Content-Type": "application/json",
216
+ "Authorization": `Bearer ${token}`,
217
+ "User-Agent": this.userAgent,
218
+ ...(isDryRun ? { "X-Dry-Run": "true" } : {}),
219
+ },
220
+ body: JSON.stringify(data),
221
+ }));
222
+ });
223
+ }
224
+ /**
225
+ * 通報を実行する (POST /api/reports)
226
+ */
227
+ async report(data) {
228
+ return await this.auth.handle401AndRetry(async (token) => {
229
+ return await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/reports`, {
230
+ method: "POST",
231
+ headers: {
232
+ "Content-Type": "application/json",
233
+ "Authorization": `Bearer ${token}`,
234
+ "User-Agent": this.userAgent,
235
+ },
236
+ body: JSON.stringify(data),
237
+ }));
238
+ });
239
+ }
240
+ /**
241
+ * Karma ランキングを取得する (GET /api/ranking)
242
+ */
243
+ async getRanking(page = 1, limit = 20) {
244
+ const authHeaders = await this.getAuthHeaders();
245
+ return await this.rateLimitHandler.execute(() => fetch(`${this.apiUrl}/ranking?page=${page}&limit=${limit}`, {
246
+ method: "GET",
247
+ headers: {
248
+ "Accept": "application/json",
249
+ "User-Agent": this.userAgent,
250
+ ...authHeaders,
251
+ },
252
+ }));
253
+ }
254
+ }
255
+ //# sourceMappingURL=threadClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threadClient.js","sourceRoot":"","sources":["../src/threadClient.ts"],"names":[],"mappings":"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"}