@blogic-cz/agent-tools 1.7.4 → 1.8.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 (128) hide show
  1. package/README.md +2 -1
  2. package/dist/db-tool/service.d.ts.map +1 -1
  3. package/dist/gh-tool/branch.d.ts +2 -3
  4. package/dist/gh-tool/branch.d.ts.map +1 -1
  5. package/dist/gh-tool/environment.d.ts +1 -1
  6. package/dist/gh-tool/environment.d.ts.map +1 -1
  7. package/dist/gh-tool/gist.d.ts +8 -28
  8. package/dist/gh-tool/gist.d.ts.map +1 -1
  9. package/dist/gh-tool/issue/commands.d.ts +9 -9
  10. package/dist/gh-tool/issue/commands.d.ts.map +1 -1
  11. package/dist/gh-tool/issue/core.d.ts +103 -9
  12. package/dist/gh-tool/issue/core.d.ts.map +1 -1
  13. package/dist/gh-tool/issue/triage.d.ts +6 -6
  14. package/dist/gh-tool/issue/triage.d.ts.map +1 -1
  15. package/dist/gh-tool/pr/commands.d.ts +53 -46
  16. package/dist/gh-tool/pr/commands.d.ts.map +1 -1
  17. package/dist/gh-tool/pr/core.d.ts +179 -74
  18. package/dist/gh-tool/pr/core.d.ts.map +1 -1
  19. package/dist/gh-tool/pr/review.d.ts +16 -16
  20. package/dist/gh-tool/pr/review.d.ts.map +1 -1
  21. package/dist/gh-tool/pr/snapshot.d.ts +9 -0
  22. package/dist/gh-tool/pr/snapshot.d.ts.map +1 -0
  23. package/dist/gh-tool/pr/stack-read.d.ts +1 -6
  24. package/dist/gh-tool/pr/stack-read.d.ts.map +1 -1
  25. package/dist/gh-tool/pr/stack.d.ts +3 -3
  26. package/dist/gh-tool/pr/stack.d.ts.map +1 -1
  27. package/dist/gh-tool/{api.d.ts → read/api.d.ts} +9 -3
  28. package/dist/gh-tool/read/api.d.ts.map +1 -0
  29. package/dist/gh-tool/read/cache.d.ts +44 -0
  30. package/dist/gh-tool/read/cache.d.ts.map +1 -0
  31. package/dist/gh-tool/read/catalog.d.ts +170 -0
  32. package/dist/gh-tool/read/catalog.d.ts.map +1 -0
  33. package/dist/gh-tool/read/classes.d.ts +94 -0
  34. package/dist/gh-tool/read/classes.d.ts.map +1 -0
  35. package/dist/gh-tool/read/commands.d.ts +3 -0
  36. package/dist/gh-tool/read/commands.d.ts.map +1 -0
  37. package/dist/gh-tool/read/gated.d.ts +14 -0
  38. package/dist/gh-tool/read/gated.d.ts.map +1 -0
  39. package/dist/gh-tool/read/index.d.ts +5 -0
  40. package/dist/gh-tool/read/index.d.ts.map +1 -0
  41. package/dist/gh-tool/read/issues.d.ts +68 -0
  42. package/dist/gh-tool/read/issues.d.ts.map +1 -0
  43. package/dist/gh-tool/read/keys.d.ts +61 -0
  44. package/dist/gh-tool/read/keys.d.ts.map +1 -0
  45. package/dist/gh-tool/read/porcelain.d.ts +68 -0
  46. package/dist/gh-tool/read/porcelain.d.ts.map +1 -0
  47. package/dist/gh-tool/read/pulls.d.ts +137 -0
  48. package/dist/gh-tool/read/pulls.d.ts.map +1 -0
  49. package/dist/gh-tool/read/reads.d.ts +209 -0
  50. package/dist/gh-tool/read/reads.d.ts.map +1 -0
  51. package/dist/gh-tool/read/rest.d.ts +49 -0
  52. package/dist/gh-tool/read/rest.d.ts.map +1 -0
  53. package/dist/gh-tool/read/review-guards.d.ts +20 -0
  54. package/dist/gh-tool/read/review-guards.d.ts.map +1 -0
  55. package/dist/gh-tool/read/review-model.d.ts +190 -0
  56. package/dist/gh-tool/read/review-model.d.ts.map +1 -0
  57. package/dist/gh-tool/read/reviews.d.ts +9 -0
  58. package/dist/gh-tool/read/reviews.d.ts.map +1 -0
  59. package/dist/gh-tool/read/stacks.d.ts +7 -0
  60. package/dist/gh-tool/read/stacks.d.ts.map +1 -0
  61. package/dist/gh-tool/read/store.d.ts +70 -0
  62. package/dist/gh-tool/read/store.d.ts.map +1 -0
  63. package/dist/gh-tool/{service.d.ts → read/transport.d.ts} +5 -3
  64. package/dist/gh-tool/read/transport.d.ts.map +1 -0
  65. package/dist/gh-tool/read/waits.d.ts +22 -0
  66. package/dist/gh-tool/read/waits.d.ts.map +1 -0
  67. package/dist/gh-tool/read/writes.d.ts +16 -0
  68. package/dist/gh-tool/read/writes.d.ts.map +1 -0
  69. package/dist/gh-tool/release.d.ts +10 -26
  70. package/dist/gh-tool/release.d.ts.map +1 -1
  71. package/dist/gh-tool/repo.d.ts +4 -4
  72. package/dist/gh-tool/repo.d.ts.map +1 -1
  73. package/dist/gh-tool/types.d.ts +1 -1
  74. package/dist/gh-tool/types.d.ts.map +1 -1
  75. package/dist/gh-tool/workflow.d.ts +43 -21
  76. package/dist/gh-tool/workflow.d.ts.map +1 -1
  77. package/dist/observability-tool/shared.d.ts.map +1 -1
  78. package/dist/shared/content-security.d.ts +2 -0
  79. package/dist/shared/content-security.d.ts.map +1 -1
  80. package/package.json +6 -6
  81. package/src/api-tool/proxy-entry.ts +3 -1
  82. package/src/db-tool/service.ts +4 -1
  83. package/src/gh-tool/branch.ts +5 -8
  84. package/src/gh-tool/environment.ts +2 -1
  85. package/src/gh-tool/gist.ts +8 -35
  86. package/src/gh-tool/issue/commands.ts +1 -1
  87. package/src/gh-tool/issue/core.ts +55 -122
  88. package/src/gh-tool/issue/triage.ts +4 -26
  89. package/src/gh-tool/main.ts +5 -2
  90. package/src/gh-tool/pr/commands.ts +19 -23
  91. package/src/gh-tool/pr/core.ts +542 -582
  92. package/src/gh-tool/pr/review.ts +106 -454
  93. package/src/gh-tool/pr/snapshot.ts +23 -0
  94. package/src/gh-tool/pr/stack-read.ts +1 -73
  95. package/src/gh-tool/pr/stack.ts +37 -36
  96. package/src/gh-tool/{api.ts → read/api.ts} +40 -7
  97. package/src/gh-tool/read/cache.ts +192 -0
  98. package/src/gh-tool/read/catalog.ts +310 -0
  99. package/src/gh-tool/read/classes.ts +30 -0
  100. package/src/gh-tool/read/commands.ts +25 -0
  101. package/src/gh-tool/read/gated.ts +56 -0
  102. package/src/gh-tool/read/index.ts +4 -0
  103. package/src/gh-tool/read/issues.ts +107 -0
  104. package/src/gh-tool/read/keys.ts +102 -0
  105. package/src/gh-tool/read/porcelain.ts +58 -0
  106. package/src/gh-tool/read/pulls.ts +266 -0
  107. package/src/gh-tool/read/reads.ts +306 -0
  108. package/src/gh-tool/read/rest.ts +111 -0
  109. package/src/gh-tool/read/review-guards.ts +61 -0
  110. package/src/gh-tool/read/review-model.ts +286 -0
  111. package/src/gh-tool/read/reviews.ts +114 -0
  112. package/src/gh-tool/read/stacks.ts +73 -0
  113. package/src/gh-tool/read/store.ts +504 -0
  114. package/src/gh-tool/{service.ts → read/transport.ts} +26 -6
  115. package/src/gh-tool/read/waits.ts +52 -0
  116. package/src/gh-tool/read/writes.ts +37 -0
  117. package/src/gh-tool/release.ts +15 -168
  118. package/src/gh-tool/repo.ts +5 -78
  119. package/src/gh-tool/types.ts +1 -1
  120. package/src/gh-tool/workflow.ts +123 -214
  121. package/src/observability-tool/shared.ts +2 -1
  122. package/src/shared/content-security.ts +10 -1
  123. package/src/shared/credential-patterns.ts +1 -1
  124. package/dist/gh-tool/api.d.ts.map +0 -1
  125. package/dist/gh-tool/pr/check-status-cache.d.ts +0 -6
  126. package/dist/gh-tool/pr/check-status-cache.d.ts.map +0 -1
  127. package/dist/gh-tool/service.d.ts.map +0 -1
  128. package/src/gh-tool/pr/check-status-cache.ts +0 -142
@@ -1,142 +0,0 @@
1
- import { Context } from "effect";
2
- import { createHash, randomUUID } from "node:crypto";
3
- import { chmod, mkdir, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
4
- import { homedir } from "node:os";
5
- import { join } from "node:path";
6
-
7
- import type { CheckResult } from "#gh/types";
8
-
9
- const CACHE_TTL_MS = 30_000;
10
- const WATCH_PENDING_TTL_MS = 5_000;
11
- const CACHE_DIR = join(homedir(), ".cache", "agent-tools", "gh-check-status-v1");
12
-
13
- export const CheckStatusCacheDirectory = Context.Reference<string | undefined>(
14
- "@agent-tools/CheckStatusCacheDirectory",
15
- { defaultValue: () => CACHE_DIR },
16
- );
17
-
18
- type CacheEntry = { fetchedAt: number; checks: CheckResult[] };
19
-
20
- const keyFor = (identity: string, repo: string, pr: number, headSha: string) =>
21
- createHash("sha256")
22
- .update(`${identity}\n${repo.toLowerCase()}\n${pr}\n${headSha}`)
23
- .digest("hex");
24
-
25
- const validChecks = (value: unknown): value is CheckResult[] =>
26
- Array.isArray(value) &&
27
- value.every(
28
- (item) =>
29
- item !== null &&
30
- typeof item === "object" &&
31
- typeof item.name === "string" &&
32
- typeof item.state === "string" &&
33
- typeof item.bucket === "string" &&
34
- typeof item.link === "string",
35
- );
36
-
37
- export const readCheckStatusCache = async (
38
- identity: string,
39
- repo: string,
40
- pr: number,
41
- headSha: string,
42
- now: number,
43
- watchPending = false,
44
- directory = CACHE_DIR,
45
- ): Promise<CheckResult[] | null> => {
46
- try {
47
- const prefix = keyFor(identity, repo, pr, headSha);
48
- const files = (await readdir(directory)).filter((name) => name.startsWith(`${prefix}.`));
49
- let latest: CacheEntry | null = null;
50
- const entries = await Promise.all(
51
- files.map(async (name) => {
52
- try {
53
- return {
54
- name,
55
- value: JSON.parse(await readFile(join(directory, name), "utf8")) as unknown,
56
- };
57
- } catch {
58
- return { name, value: null };
59
- }
60
- }),
61
- );
62
- const staleFiles: string[] = [];
63
- for (const { name, value: entry } of entries) {
64
- if (!name.endsWith(".json")) continue;
65
- if (entry === null || typeof entry !== "object") continue;
66
- const candidate = entry as Partial<CacheEntry>;
67
- const fetchedAt = candidate.fetchedAt;
68
- if (
69
- typeof fetchedAt !== "number" ||
70
- !Number.isFinite(fetchedAt) ||
71
- !validChecks(candidate.checks) ||
72
- candidate.checks.length === 0
73
- ) {
74
- staleFiles.push(join(directory, name));
75
- continue;
76
- }
77
- if (fetchedAt > now || now - fetchedAt > CACHE_TTL_MS) {
78
- staleFiles.push(join(directory, name));
79
- continue;
80
- }
81
- if (watchPending && !candidate.checks.some((check) => check.bucket === "pending")) continue;
82
- if (latest === null || fetchedAt > latest.fetchedAt)
83
- latest = { fetchedAt, checks: candidate.checks };
84
- }
85
- await Promise.all(staleFiles.map((path) => rm(path, { force: true }).catch(() => undefined)));
86
- if (latest === null || (watchPending && now - latest.fetchedAt > WATCH_PENDING_TTL_MS))
87
- return null;
88
- return latest.checks;
89
- } catch {
90
- return null;
91
- }
92
- };
93
-
94
- export const writeCheckStatusCache = async (
95
- identity: string,
96
- repo: string,
97
- pr: number,
98
- headSha: string,
99
- checks: CheckResult[],
100
- fetchedAt: number,
101
- directory = CACHE_DIR,
102
- ): Promise<void> => {
103
- if (checks.length === 0) return;
104
- try {
105
- await mkdir(directory, { recursive: true, mode: 0o700 });
106
- await chmod(directory, 0o700);
107
- await Promise.all(
108
- (await readdir(directory))
109
- .filter((name) => name.endsWith(".json"))
110
- .map(async (name) => {
111
- const path = join(directory, name);
112
- try {
113
- const entry: unknown = JSON.parse(await readFile(path, "utf8"));
114
- if (
115
- entry !== null &&
116
- typeof entry === "object" &&
117
- "fetchedAt" in entry &&
118
- typeof entry.fetchedAt === "number" &&
119
- Number.isFinite(entry.fetchedAt) &&
120
- fetchedAt - entry.fetchedAt <= CACHE_TTL_MS
121
- )
122
- return;
123
- await rm(path, { force: true });
124
- } catch {
125
- /* Another writer can remove a stale snapshot first. */
126
- }
127
- }),
128
- );
129
- const prefix = keyFor(identity, repo, pr, headSha);
130
- const temporary = join(directory, `${prefix}.${process.pid}.${randomUUID()}.tmp`);
131
- const destination = join(
132
- directory,
133
- `${prefix}.${fetchedAt}.${process.pid}.${randomUUID()}.json`,
134
- );
135
- await writeFile(temporary, JSON.stringify({ fetchedAt, checks } satisfies CacheEntry), {
136
- mode: 0o600,
137
- });
138
- await rename(temporary, destination);
139
- } catch {
140
- // A cache write must never replace a successful GitHub response with an error.
141
- }
142
- };