github-issue-tower-defence-management 1.59.0 → 1.60.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 (32) hide show
  1. package/.github/workflows/create-pr.yml +1 -1
  2. package/.github/workflows/test.yml +4 -0
  3. package/.github/workflows/umino-project.yml +3 -3
  4. package/CHANGELOG.md +7 -0
  5. package/bin/adapter/proxy/ClaudeMessageResponseParser.js +123 -0
  6. package/bin/adapter/proxy/ClaudeMessageResponseParser.js.map +1 -0
  7. package/bin/adapter/proxy/proxyEntry.js +16 -3
  8. package/bin/adapter/proxy/proxyEntry.js.map +1 -1
  9. package/bin/adapter/repositories/SqliteClaudeMessageResponseRepository.js +186 -0
  10. package/bin/adapter/repositories/SqliteClaudeMessageResponseRepository.js.map +1 -0
  11. package/bin/domain/entities/ClaudeMessageResponse.js +3 -0
  12. package/bin/domain/entities/ClaudeMessageResponse.js.map +1 -0
  13. package/bin/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.js +3 -0
  14. package/bin/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.js.map +1 -0
  15. package/package.json +3 -1
  16. package/src/adapter/proxy/ClaudeMessageResponseParser.test.ts +211 -0
  17. package/src/adapter/proxy/ClaudeMessageResponseParser.ts +180 -0
  18. package/src/adapter/proxy/proxyEntry.ts +28 -3
  19. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.test.ts +313 -0
  20. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.ts +164 -0
  21. package/src/domain/entities/ClaudeMessageResponse.ts +31 -0
  22. package/src/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.ts +5 -0
  23. package/types/adapter/proxy/ClaudeMessageResponseParser.d.ts +4 -0
  24. package/types/adapter/proxy/ClaudeMessageResponseParser.d.ts.map +1 -0
  25. package/types/adapter/proxy/proxyEntry.d.ts +2 -1
  26. package/types/adapter/proxy/proxyEntry.d.ts.map +1 -1
  27. package/types/adapter/repositories/SqliteClaudeMessageResponseRepository.d.ts +10 -0
  28. package/types/adapter/repositories/SqliteClaudeMessageResponseRepository.d.ts.map +1 -0
  29. package/types/domain/entities/ClaudeMessageResponse.d.ts +32 -0
  30. package/types/domain/entities/ClaudeMessageResponse.d.ts.map +1 -0
  31. package/types/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.d.ts +5 -0
  32. package/types/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.d.ts.map +1 -0
@@ -35,7 +35,7 @@ jobs:
35
35
  - name: Create Pull Request
36
36
  id: create_pr
37
37
  if: steps.check_pr.outputs.existing_pr == ''
38
- uses: repo-sync/pull-request@v2
38
+ uses: repo-sync/pull-request@7e79a9f5dc3ad0ce53138f01df2fad14a04831c5
39
39
  with:
40
40
  github_token: ${{ steps.app-token.outputs.token }}
41
41
  destination_branch: 'main'
@@ -23,6 +23,10 @@ jobs:
23
23
  - name: Install dependencies
24
24
  run: npm ci
25
25
 
26
+ - name: Build native modules
27
+ working-directory: node_modules/better-sqlite3
28
+ run: node ../prebuild-install/bin.js || npm exec --yes -- node-gyp rebuild --release
29
+
26
30
  - name: Prepare
27
31
  run: npm run prepare
28
32
 
@@ -228,7 +228,7 @@ jobs:
228
228
  if: >-
229
229
  github.event_name == 'issues' &&
230
230
  github.event.action == 'opened'
231
- uses: pozil/auto-assign-issue@v3.0.0
231
+ uses: pozil/auto-assign-issue@70adb98ca8b3941524e9ecde48e89067c4f96736
232
232
  with:
233
233
  assignees: HiromiShikata
234
234
  repo-token: ${{ steps.app-token.outputs.token }}
@@ -236,7 +236,7 @@ jobs:
236
236
  if: >-
237
237
  github.event_name == 'pull_request' &&
238
238
  github.event.action == 'opened'
239
- uses: pozil/auto-assign-issue@v3.0.0
239
+ uses: pozil/auto-assign-issue@70adb98ca8b3941524e9ecde48e89067c4f96736
240
240
  with:
241
241
  assignees: HiromiShikata
242
242
  repo-token: ${{ steps.app-token.outputs.token }}
@@ -254,7 +254,7 @@ jobs:
254
254
  app-id: ${{ secrets.HS_BOT_GH_AP_APP_ID }}
255
255
  private-key: ${{ secrets.HS_BOT_GH_AP_PRIVATE_KEY }}
256
256
  owner: HiromiShikata
257
- - uses: nearform-actions/github-action-check-linked-issues@v1
257
+ - uses: nearform-actions/github-action-check-linked-issues@7140e2e01aa0c18b8ac61bddf5e89abde1ca760e
258
258
  id: check-linked-issues
259
259
  if: github.event.pull_request.user.login != 'dependabot[bot]'
260
260
  with:
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [1.60.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.59.0...v1.60.0) (2026-05-25)
2
+
3
+
4
+ ### Features
5
+
6
+ * **core:** introduce ClaudeMessageResponse entity and SQLite persistence in proxy ([41b4452](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/41b44523f3d56d6207dfe3cfc03a56cb107de000)), closes [#651](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/651) [#651](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/651)
7
+
1
8
  # [1.59.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.58.3...v1.59.0) (2026-05-24)
2
9
 
3
10
 
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseClaudeMessageResponse = void 0;
4
+ const SqliteClaudeMessageResponseRepository_1 = require("../repositories/SqliteClaudeMessageResponseRepository");
5
+ const pickHeader = (headers, key) => {
6
+ const value = headers[key];
7
+ if (Array.isArray(value))
8
+ return value[0] ?? null;
9
+ return value ?? null;
10
+ };
11
+ const parseNullableFloat = (value) => {
12
+ if (value === null)
13
+ return null;
14
+ const parsed = parseFloat(value);
15
+ return Number.isFinite(parsed) ? parsed : null;
16
+ };
17
+ const parseNullableInt = (value) => {
18
+ if (value === null || value === undefined)
19
+ return null;
20
+ const parsed = typeof value === 'number' ? value : parseInt(String(value), 10);
21
+ return Number.isFinite(parsed) ? parsed : null;
22
+ };
23
+ const isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
24
+ const extractUsage = (body) => {
25
+ const usage = body['usage'];
26
+ if (!isRecord(usage)) {
27
+ return {
28
+ inputTokens: null,
29
+ outputTokens: null,
30
+ cacheCreationInputTokens: null,
31
+ cacheReadInputTokens: null,
32
+ ephemeral5mInputTokens: null,
33
+ ephemeral1hInputTokens: null,
34
+ };
35
+ }
36
+ return {
37
+ inputTokens: parseNullableInt(usage['input_tokens']),
38
+ outputTokens: parseNullableInt(usage['output_tokens']),
39
+ cacheCreationInputTokens: parseNullableInt(usage['cache_creation_input_tokens']),
40
+ cacheReadInputTokens: parseNullableInt(usage['cache_read_input_tokens']),
41
+ ephemeral5mInputTokens: parseNullableInt(usage['ephemeral_5m_input_tokens']),
42
+ ephemeral1hInputTokens: parseNullableInt(usage['ephemeral_1h_input_tokens']),
43
+ };
44
+ };
45
+ const extractRole = (body) => {
46
+ const role = body['role'];
47
+ return typeof role === 'string' ? role : null;
48
+ };
49
+ const extractFirstContentRole = (body) => {
50
+ const content = body['content'];
51
+ if (!Array.isArray(content))
52
+ return null;
53
+ const first = content[0];
54
+ if (!isRecord(first))
55
+ return null;
56
+ const role = first['role'];
57
+ return typeof role === 'string' ? role : null;
58
+ };
59
+ const parseClaudeMessageResponse = (tokenName, httpStatus, headers, body) => {
60
+ let parsedBody = {};
61
+ try {
62
+ const parsed = JSON.parse(body);
63
+ if (isRecord(parsed)) {
64
+ parsedBody = parsed;
65
+ }
66
+ }
67
+ catch {
68
+ parsedBody = {};
69
+ }
70
+ const errorObj = parsedBody['error'];
71
+ const errorRecord = isRecord(errorObj) ? errorObj : null;
72
+ const errorType = errorRecord !== null && typeof errorRecord['type'] === 'string'
73
+ ? errorRecord['type']
74
+ : null;
75
+ const errorMessage = errorRecord !== null && typeof errorRecord['message'] === 'string'
76
+ ? errorRecord['message']
77
+ : null;
78
+ const externalClaudeMessageId = typeof parsedBody['id'] === 'string' ? parsedBody['id'] : null;
79
+ const model = typeof parsedBody['model'] === 'string' ? parsedBody['model'] : null;
80
+ const role = extractRole(parsedBody) ?? extractFirstContentRole(parsedBody);
81
+ const stopReason = typeof parsedBody['stop_reason'] === 'string'
82
+ ? parsedBody['stop_reason']
83
+ : null;
84
+ const stopSequence = typeof parsedBody['stop_sequence'] === 'string'
85
+ ? parsedBody['stop_sequence']
86
+ : null;
87
+ const usage = extractUsage(parsedBody);
88
+ const retryAfterRaw = pickHeader(headers, 'retry-after');
89
+ const retryAfter = parseNullableFloat(retryAfterRaw);
90
+ return {
91
+ id: (0, SqliteClaudeMessageResponseRepository_1.generateUlid)(),
92
+ observedAt: new Date(),
93
+ tokenName,
94
+ externalClaudeMessageId,
95
+ externalClaudeRequestId: pickHeader(headers, 'x-request-id'),
96
+ httpStatus,
97
+ model,
98
+ role,
99
+ stopReason,
100
+ stopSequence,
101
+ inputTokens: usage.inputTokens,
102
+ outputTokens: usage.outputTokens,
103
+ cacheCreationInputTokens: usage.cacheCreationInputTokens,
104
+ cacheReadInputTokens: usage.cacheReadInputTokens,
105
+ ephemeral5mInputTokens: usage.ephemeral5mInputTokens,
106
+ ephemeral1hInputTokens: usage.ephemeral1hInputTokens,
107
+ serviceTier: pickHeader(headers, 'anthropic-service-tier'),
108
+ inferenceGeo: pickHeader(headers, 'anthropic-inference-geo'),
109
+ errorType,
110
+ errorMessage,
111
+ anthropicRatelimitUnifiedStatus: pickHeader(headers, 'anthropic-ratelimit-unified-status'),
112
+ anthropicRatelimitUnified5hStatus: pickHeader(headers, 'anthropic-ratelimit-unified-5h-status'),
113
+ anthropicRatelimitUnified5hUtilization: parseNullableFloat(pickHeader(headers, 'anthropic-ratelimit-unified-5h-utilization')),
114
+ anthropicRatelimitUnified5hReset: parseNullableFloat(pickHeader(headers, 'anthropic-ratelimit-unified-5h-reset')),
115
+ anthropicRatelimitUnified7dStatus: pickHeader(headers, 'anthropic-ratelimit-unified-7d-status'),
116
+ anthropicRatelimitUnified7dUtilization: parseNullableFloat(pickHeader(headers, 'anthropic-ratelimit-unified-7d-utilization')),
117
+ anthropicRatelimitUnified7dReset: parseNullableFloat(pickHeader(headers, 'anthropic-ratelimit-unified-7d-reset')),
118
+ retryAfter,
119
+ anthropicOrganizationId: pickHeader(headers, 'anthropic-organization-id'),
120
+ };
121
+ };
122
+ exports.parseClaudeMessageResponse = parseClaudeMessageResponse;
123
+ //# sourceMappingURL=ClaudeMessageResponseParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeMessageResponseParser.js","sourceRoot":"","sources":["../../../src/adapter/proxy/ClaudeMessageResponseParser.ts"],"names":[],"mappings":";;;AAEA,iHAAqF;AAErF,MAAM,UAAU,GAAG,CACjB,OAAiC,EACjC,GAAW,EACI,EAAE;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAClD,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAoB,EAAiB,EAAE;IACjE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAiB,EAAE;IACzD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,MAAM,GACV,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAClE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,YAAY,GAAG,CACnB,IAA6B,EAQ7B,EAAE;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,IAAI;YAClB,wBAAwB,EAAE,IAAI;YAC9B,oBAAoB,EAAE,IAAI;YAC1B,sBAAsB,EAAE,IAAI;YAC5B,sBAAsB,EAAE,IAAI;SAC7B,CAAC;IACJ,CAAC;IACD,OAAO;QACL,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACpD,YAAY,EAAE,gBAAgB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACtD,wBAAwB,EAAE,gBAAgB,CACxC,KAAK,CAAC,6BAA6B,CAAC,CACrC;QACD,oBAAoB,EAAE,gBAAgB,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACxE,sBAAsB,EAAE,gBAAgB,CACtC,KAAK,CAAC,2BAA2B,CAAC,CACnC;QACD,sBAAsB,EAAE,gBAAgB,CACtC,KAAK,CAAC,2BAA2B,CAAC,CACnC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAA6B,EAAiB,EAAE;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC9B,IAA6B,EACd,EAAE;IACjB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,KAAK,GAAY,OAAO,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC,CAAC;AAEK,MAAM,0BAA0B,GAAG,CACxC,SAAiB,EACjB,UAAkB,EAClB,OAAiC,EACjC,IAAY,EACW,EAAE;IACzB,IAAI,UAAU,GAA4B,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,MAAM,SAAS,GACb,WAAW,KAAK,IAAI,IAAI,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,QAAQ;QAC7D,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;QACrB,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,YAAY,GAChB,WAAW,KAAK,IAAI,IAAI,OAAO,WAAW,CAAC,SAAS,CAAC,KAAK,QAAQ;QAChE,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC;QACxB,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,uBAAuB,GAC3B,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEjE,MAAM,KAAK,GACT,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvE,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAE5E,MAAM,UAAU,GACd,OAAO,UAAU,CAAC,aAAa,CAAC,KAAK,QAAQ;QAC3C,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC;QAC3B,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,YAAY,GAChB,OAAO,UAAU,CAAC,eAAe,CAAC,KAAK,QAAQ;QAC7C,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC;QAC7B,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAEvC,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAErD,OAAO;QACL,EAAE,EAAE,IAAA,oDAAY,GAAE;QAClB,UAAU,EAAE,IAAI,IAAI,EAAE;QACtB,SAAS;QACT,uBAAuB;QACvB,uBAAuB,EAAE,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC;QAC5D,UAAU;QACV,KAAK;QACL,IAAI;QACJ,UAAU;QACV,YAAY;QACZ,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,wBAAwB,EAAE,KAAK,CAAC,wBAAwB;QACxD,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,WAAW,EAAE,UAAU,CAAC,OAAO,EAAE,wBAAwB,CAAC;QAC1D,YAAY,EAAE,UAAU,CAAC,OAAO,EAAE,yBAAyB,CAAC;QAC5D,SAAS;QACT,YAAY;QACZ,+BAA+B,EAAE,UAAU,CACzC,OAAO,EACP,oCAAoC,CACrC;QACD,iCAAiC,EAAE,UAAU,CAC3C,OAAO,EACP,uCAAuC,CACxC;QACD,sCAAsC,EAAE,kBAAkB,CACxD,UAAU,CAAC,OAAO,EAAE,4CAA4C,CAAC,CAClE;QACD,gCAAgC,EAAE,kBAAkB,CAClD,UAAU,CAAC,OAAO,EAAE,sCAAsC,CAAC,CAC5D;QACD,iCAAiC,EAAE,UAAU,CAC3C,OAAO,EACP,uCAAuC,CACxC;QACD,sCAAsC,EAAE,kBAAkB,CACxD,UAAU,CAAC,OAAO,EAAE,4CAA4C,CAAC,CAClE;QACD,gCAAgC,EAAE,kBAAkB,CAClD,UAAU,CAAC,OAAO,EAAE,sCAAsC,CAAC,CAC5D;QACD,UAAU;QACV,uBAAuB,EAAE,UAAU,CAAC,OAAO,EAAE,2BAA2B,CAAC;KAC1E,CAAC;AACJ,CAAC,CAAC;AAjGW,QAAA,0BAA0B,8BAiGrC"}
@@ -37,6 +37,8 @@ exports.extractToken = exports.startProxy = void 0;
37
37
  const http = __importStar(require("http"));
38
38
  const https = __importStar(require("https"));
39
39
  const RateLimitCache_1 = require("./RateLimitCache");
40
+ const ClaudeMessageResponseParser_1 = require("./ClaudeMessageResponseParser");
41
+ const SqliteClaudeMessageResponseRepository_1 = require("../repositories/SqliteClaudeMessageResponseRepository");
40
42
  const UPSTREAM_HOST = 'api.anthropic.com';
41
43
  const MAX_INSPECTED_BODY_BYTES = 1024 * 1024;
42
44
  const BEARER_PREFIX = 'bearer ';
@@ -52,7 +54,7 @@ const extractToken = (authorization) => {
52
54
  return token.length > 0 ? token : null;
53
55
  };
54
56
  exports.extractToken = extractToken;
55
- const startProxy = (port) => {
57
+ const startProxy = (port, claudeMessageResponseRepository = null) => {
56
58
  const server = http.createServer((clientRequest, clientResponse) => {
57
59
  const token = extractToken(clientRequest.headers['authorization']);
58
60
  const upstreamHeaders = {
@@ -82,14 +84,23 @@ const startProxy = (port) => {
82
84
  inspectedBytes += chunk.length;
83
85
  });
84
86
  upstreamResponse.on('end', () => {
87
+ const body = Buffer.concat(inspectedChunks).toString('utf8');
85
88
  try {
86
- const body = Buffer.concat(inspectedChunks).toString('utf8');
87
89
  const limits = (0, RateLimitCache_1.parseModelRateLimitsFromBody)(body);
88
90
  (0, RateLimitCache_1.writeModelRateLimit)(token, limits);
89
91
  }
90
92
  catch (error) {
91
93
  console.error('Failed to write model rate limit cache:', error);
92
94
  }
95
+ if (claudeMessageResponseRepository !== null) {
96
+ try {
97
+ const response = (0, ClaudeMessageResponseParser_1.parseClaudeMessageResponse)((0, RateLimitCache_1.hashToken)(token), upstreamResponse.statusCode ?? 0, upstreamResponse.headers, body);
98
+ claudeMessageResponseRepository.append(response);
99
+ }
100
+ catch (error) {
101
+ console.error('Failed to record Claude message response:', error);
102
+ }
103
+ }
93
104
  });
94
105
  }
95
106
  clientResponse.writeHead(upstreamResponse.statusCode ?? 502, upstreamResponse.headers);
@@ -110,6 +121,8 @@ const startProxy = (port) => {
110
121
  };
111
122
  exports.startProxy = startProxy;
112
123
  if (require.main === module) {
113
- startProxy(RateLimitCache_1.PROXY_PORT);
124
+ const dbPath = './db/claude_message_response.db';
125
+ const repository = new SqliteClaudeMessageResponseRepository_1.SqliteClaudeMessageResponseRepository(dbPath);
126
+ startProxy(RateLimitCache_1.PROXY_PORT, repository);
114
127
  }
115
128
  //# sourceMappingURL=proxyEntry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxyEntry.js","sourceRoot":"","sources":["../../../src/adapter/proxy/proxyEntry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxyEntry.js","sourceRoot":"","sources":["../../../src/adapter/proxy/proxyEntry.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,6CAA+B;AAC/B,qDAM0B;AAE1B,+EAA2E;AAC3E,iHAA8G;AAE9G,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAE1C,MAAM,wBAAwB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7C,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,MAAM,YAAY,GAAG,CACnB,aAA4C,EAC7B,EAAE;IACjB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IAC9E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,aAAa;QACtE,OAAO,IAAI,CAAC;IACd,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC,CAAC;AAuFmB,oCAAY;AArFjC,MAAM,UAAU,GAAG,CACjB,IAAY,EACZ,kCAA0E,IAAI,EACxE,EAAE;IACR,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE;QACjE,MAAM,KAAK,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;QACnE,MAAM,eAAe,GAAkD;YACrE,GAAG,aAAa,CAAC,OAAO;YACxB,IAAI,EAAE,aAAa;SACpB,CAAC;QACF,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CACnC;YACE,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,IAAI,EAAE,aAAa,CAAC,GAAG;YACvB,OAAO,EAAE,eAAe;SACzB,EACD,CAAC,gBAAgB,EAAE,EAAE;YACnB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC;oBACH,IAAA,+BAAc,EAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAClD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;gBAC5D,CAAC;gBACD,MAAM,eAAe,GAAiB,EAAE,CAAC;gBACzC,IAAI,cAAc,GAAG,CAAC,CAAC;gBACvB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC5C,IAAI,cAAc,IAAI,wBAAwB;wBAAE,OAAO;oBACvD,eAAe,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC5C,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;gBACjC,CAAC,CAAC,CAAC;gBACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC7D,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAA,6CAA4B,EAAC,IAAI,CAAC,CAAC;wBAClD,IAAA,oCAAmB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBACrC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;oBAClE,CAAC;oBACD,IAAI,+BAA+B,KAAK,IAAI,EAAE,CAAC;wBAC7C,IAAI,CAAC;4BACH,MAAM,QAAQ,GAAG,IAAA,wDAA0B,EACzC,IAAA,0BAAS,EAAC,KAAK,CAAC,EAChB,gBAAgB,CAAC,UAAU,IAAI,CAAC,EAChC,gBAAgB,CAAC,OAAO,EACxB,IAAI,CACL,CAAC;4BACF,+BAA+B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBACnD,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,OAAO,CAAC,KAAK,CACX,2CAA2C,EAC3C,KAAK,CACN,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YACD,cAAc,CAAC,SAAS,CACtB,gBAAgB,CAAC,UAAU,IAAI,GAAG,EAClC,gBAAgB,CAAC,OAAO,CACzB,CAAC;YACF,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC,CACF,CAAC;QACF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACpC,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;gBAChC,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;QACpC,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAQO,gCAAU;AANnB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,iCAAiC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,6EAAqC,CAAC,MAAM,CAAC,CAAC;IACrE,UAAU,CAAC,2BAAU,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SqliteClaudeMessageResponseRepository = exports.generateUlid = void 0;
40
+ const crypto = __importStar(require("crypto"));
41
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const ULID_ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
45
+ const encodeUlidTime = (ms) => {
46
+ let str = '';
47
+ for (let i = 9; i >= 0; i--) {
48
+ str = ULID_ENCODING[ms % 32] + str;
49
+ ms = Math.floor(ms / 32);
50
+ }
51
+ return str;
52
+ };
53
+ const encodeUlidRandom = () => {
54
+ const bytes = crypto.randomBytes(10);
55
+ let bits = 0;
56
+ let bitLen = 0;
57
+ let str = '';
58
+ for (let i = 0; i < bytes.length && str.length < 16; i++) {
59
+ bits = (bits << 8) | bytes[i];
60
+ bitLen += 8;
61
+ while (bitLen >= 5 && str.length < 16) {
62
+ str += ULID_ENCODING[(bits >>> (bitLen - 5)) & 0x1f];
63
+ bitLen -= 5;
64
+ }
65
+ }
66
+ return str;
67
+ };
68
+ const generateUlid = () => encodeUlidTime(Date.now()) + encodeUlidRandom();
69
+ exports.generateUlid = generateUlid;
70
+ const CREATE_TABLE_SQL = `
71
+ CREATE TABLE IF NOT EXISTS claude_message_response (
72
+ id TEXT PRIMARY KEY,
73
+ observed_at INTEGER NOT NULL,
74
+ token_name TEXT NOT NULL,
75
+ external_claude_message_id TEXT,
76
+ external_claude_request_id TEXT,
77
+ http_status INTEGER NOT NULL,
78
+ model TEXT,
79
+ role TEXT,
80
+ stop_reason TEXT,
81
+ stop_sequence TEXT,
82
+ input_tokens INTEGER,
83
+ output_tokens INTEGER,
84
+ cache_creation_input_tokens INTEGER,
85
+ cache_read_input_tokens INTEGER,
86
+ ephemeral_5m_input_tokens INTEGER,
87
+ ephemeral_1h_input_tokens INTEGER,
88
+ service_tier TEXT,
89
+ inference_geo TEXT,
90
+ error_type TEXT,
91
+ error_message TEXT,
92
+ anthropic_ratelimit_unified_status TEXT,
93
+ anthropic_ratelimit_unified_5h_status TEXT,
94
+ anthropic_ratelimit_unified_5h_utilization REAL,
95
+ anthropic_ratelimit_unified_5h_reset REAL,
96
+ anthropic_ratelimit_unified_7d_status TEXT,
97
+ anthropic_ratelimit_unified_7d_utilization REAL,
98
+ anthropic_ratelimit_unified_7d_reset REAL,
99
+ retry_after REAL,
100
+ anthropic_organization_id TEXT
101
+ ) STRICT
102
+ `;
103
+ const INSERT_SQL = `
104
+ INSERT INTO claude_message_response (
105
+ id, observed_at, token_name,
106
+ external_claude_message_id, external_claude_request_id,
107
+ http_status, model, role, stop_reason, stop_sequence,
108
+ input_tokens, output_tokens,
109
+ cache_creation_input_tokens, cache_read_input_tokens,
110
+ ephemeral_5m_input_tokens, ephemeral_1h_input_tokens,
111
+ service_tier, inference_geo,
112
+ error_type, error_message,
113
+ anthropic_ratelimit_unified_status,
114
+ anthropic_ratelimit_unified_5h_status,
115
+ anthropic_ratelimit_unified_5h_utilization,
116
+ anthropic_ratelimit_unified_5h_reset,
117
+ anthropic_ratelimit_unified_7d_status,
118
+ anthropic_ratelimit_unified_7d_utilization,
119
+ anthropic_ratelimit_unified_7d_reset,
120
+ retry_after, anthropic_organization_id
121
+ ) VALUES (
122
+ @id, @observedAt, @tokenName,
123
+ @externalClaudeMessageId, @externalClaudeRequestId,
124
+ @httpStatus, @model, @role, @stopReason, @stopSequence,
125
+ @inputTokens, @outputTokens,
126
+ @cacheCreationInputTokens, @cacheReadInputTokens,
127
+ @ephemeral5mInputTokens, @ephemeral1hInputTokens,
128
+ @serviceTier, @inferenceGeo,
129
+ @errorType, @errorMessage,
130
+ @anthropicRatelimitUnifiedStatus,
131
+ @anthropicRatelimitUnified5hStatus,
132
+ @anthropicRatelimitUnified5hUtilization,
133
+ @anthropicRatelimitUnified5hReset,
134
+ @anthropicRatelimitUnified7dStatus,
135
+ @anthropicRatelimitUnified7dUtilization,
136
+ @anthropicRatelimitUnified7dReset,
137
+ @retryAfter, @anthropicOrganizationId
138
+ )
139
+ `;
140
+ class SqliteClaudeMessageResponseRepository {
141
+ constructor(dbPath) {
142
+ this.append = (response) => {
143
+ this.insert.run({
144
+ id: response.id,
145
+ observedAt: response.observedAt.getTime(),
146
+ tokenName: response.tokenName,
147
+ externalClaudeMessageId: response.externalClaudeMessageId,
148
+ externalClaudeRequestId: response.externalClaudeRequestId,
149
+ httpStatus: response.httpStatus,
150
+ model: response.model,
151
+ role: response.role,
152
+ stopReason: response.stopReason,
153
+ stopSequence: response.stopSequence,
154
+ inputTokens: response.inputTokens,
155
+ outputTokens: response.outputTokens,
156
+ cacheCreationInputTokens: response.cacheCreationInputTokens,
157
+ cacheReadInputTokens: response.cacheReadInputTokens,
158
+ ephemeral5mInputTokens: response.ephemeral5mInputTokens,
159
+ ephemeral1hInputTokens: response.ephemeral1hInputTokens,
160
+ serviceTier: response.serviceTier,
161
+ inferenceGeo: response.inferenceGeo,
162
+ errorType: response.errorType,
163
+ errorMessage: response.errorMessage,
164
+ anthropicRatelimitUnifiedStatus: response.anthropicRatelimitUnifiedStatus,
165
+ anthropicRatelimitUnified5hStatus: response.anthropicRatelimitUnified5hStatus,
166
+ anthropicRatelimitUnified5hUtilization: response.anthropicRatelimitUnified5hUtilization,
167
+ anthropicRatelimitUnified5hReset: response.anthropicRatelimitUnified5hReset,
168
+ anthropicRatelimitUnified7dStatus: response.anthropicRatelimitUnified7dStatus,
169
+ anthropicRatelimitUnified7dUtilization: response.anthropicRatelimitUnified7dUtilization,
170
+ anthropicRatelimitUnified7dReset: response.anthropicRatelimitUnified7dReset,
171
+ retryAfter: response.retryAfter,
172
+ anthropicOrganizationId: response.anthropicOrganizationId,
173
+ });
174
+ };
175
+ const dir = path.dirname(dbPath);
176
+ if (!fs.existsSync(dir)) {
177
+ fs.mkdirSync(dir, { recursive: true });
178
+ }
179
+ this.db = new better_sqlite3_1.default(dbPath);
180
+ this.db.pragma('journal_mode = WAL');
181
+ this.db.exec(CREATE_TABLE_SQL);
182
+ this.insert = this.db.prepare(INSERT_SQL);
183
+ }
184
+ }
185
+ exports.SqliteClaudeMessageResponseRepository = SqliteClaudeMessageResponseRepository;
186
+ //# sourceMappingURL=SqliteClaudeMessageResponseRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteClaudeMessageResponseRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/SqliteClaudeMessageResponseRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ClaudeMessageResponse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeMessageResponse.js","sourceRoot":"","sources":["../../../src/domain/entities/ClaudeMessageResponse.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ClaudeMessageResponseRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeMessageResponseRepository.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.59.0",
3
+ "version": "1.60.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -50,6 +50,7 @@
50
50
  "devDependencies": {
51
51
  "@semantic-release/changelog": "^6.0.3",
52
52
  "@semantic-release/commit-analyzer": "^13.0.0",
53
+ "@types/better-sqlite3": "7.6.13",
53
54
  "@types/cookie": "^1.0.0",
54
55
  "@types/jest": "^29.5.12",
55
56
  "@typescript-eslint/eslint-plugin": "^7.2.0",
@@ -72,6 +73,7 @@
72
73
  "typescript": "^6.0.0"
73
74
  },
74
75
  "dependencies": {
76
+ "better-sqlite3": "12.10.0",
75
77
  "cheerio": "^1.0.0",
76
78
  "commander": "^14.0.0",
77
79
  "cookie": "^1.0.1",