@diff-review-system/drs 4.0.1 → 5.0.0-rc.1

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 (218) hide show
  1. package/.pi/agents/review/unified-reviewer.md +2 -6
  2. package/.pi/agents/task/okf-wiki-maintainer.md +72 -0
  3. package/.pi/agents/task/review-assistant.md +22 -0
  4. package/.pi/workflows/github-pr-fix-review-issues-stacked.yaml +12 -4
  5. package/.pi/workflows/github-pr-review-post.yaml +29 -20
  6. package/.pi/workflows/github-pr-review.yaml +37 -8
  7. package/.pi/workflows/github-pr-update-agents-md-stacked.yaml +2 -0
  8. package/.pi/workflows/github-pr-visual-explain.yaml +46 -1
  9. package/.pi/workflows/gitlab-mr-fix-review-issues-stacked.yaml +12 -4
  10. package/.pi/workflows/gitlab-mr-review.yaml +20 -8
  11. package/.pi/workflows/gitlab-mr-update-agents-md-stacked.yaml +2 -0
  12. package/.pi/workflows/gitlab-mr-visual-explain.yaml +46 -1
  13. package/.pi/workflows/local-fix-review-issues.yaml +13 -6
  14. package/.pi/workflows/local-review.yaml +7 -1
  15. package/.pi/workflows/local-visual-explain.yaml +46 -1
  16. package/.pi/workflows/release-changelog-finalize.yaml +10 -0
  17. package/.pi/workflows/repository-wiki-check.yaml +40 -0
  18. package/.pi/workflows/repository-wiki-sync.yaml +187 -0
  19. package/.pi/workflows/temporal-control-smoke.yaml +63 -0
  20. package/.wiki-site/.vitepress/config.mts +452 -0
  21. package/.wiki-site/.vitepress/theme/PageLead.vue +122 -0
  22. package/.wiki-site/.vitepress/theme/index.ts +12 -0
  23. package/.wiki-site/.vitepress/theme/style.css +270 -0
  24. package/README.md +77 -4
  25. package/dist/cli/index.js +87 -4
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/cli/init.d.ts +6 -1
  28. package/dist/cli/init.d.ts.map +1 -1
  29. package/dist/cli/init.js +26 -10
  30. package/dist/cli/init.js.map +1 -1
  31. package/dist/cli/run-agent.d.ts +5 -7
  32. package/dist/cli/run-agent.d.ts.map +1 -1
  33. package/dist/cli/run-agent.js +56 -5
  34. package/dist/cli/run-agent.js.map +1 -1
  35. package/dist/cli/wiki.d.ts +3 -0
  36. package/dist/cli/wiki.d.ts.map +1 -0
  37. package/dist/cli/wiki.js +174 -0
  38. package/dist/cli/wiki.js.map +1 -0
  39. package/dist/cli/workflow-executor-selection.d.ts +3 -0
  40. package/dist/cli/workflow-executor-selection.d.ts.map +1 -0
  41. package/dist/cli/workflow-executor-selection.js +15 -0
  42. package/dist/cli/workflow-executor-selection.js.map +1 -0
  43. package/dist/cli/workflow.d.ts +40 -42
  44. package/dist/cli/workflow.d.ts.map +1 -1
  45. package/dist/cli/workflow.js +533 -868
  46. package/dist/cli/workflow.js.map +1 -1
  47. package/dist/github/client.d.ts.map +1 -1
  48. package/dist/github/client.js +2 -2
  49. package/dist/github/client.js.map +1 -1
  50. package/dist/github/platform-adapter.d.ts.map +1 -1
  51. package/dist/github/platform-adapter.js +15 -1
  52. package/dist/github/platform-adapter.js.map +1 -1
  53. package/dist/gitlab/client.d.ts +4 -0
  54. package/dist/gitlab/client.d.ts.map +1 -1
  55. package/dist/gitlab/client.js +17 -1
  56. package/dist/gitlab/client.js.map +1 -1
  57. package/dist/gitlab/platform-adapter.d.ts.map +1 -1
  58. package/dist/gitlab/platform-adapter.js +17 -1
  59. package/dist/gitlab/platform-adapter.js.map +1 -1
  60. package/dist/lib/agent-permissions.d.ts +44 -0
  61. package/dist/lib/agent-permissions.d.ts.map +1 -0
  62. package/dist/lib/agent-permissions.js +358 -0
  63. package/dist/lib/agent-permissions.js.map +1 -0
  64. package/dist/lib/agent-result.d.ts +10 -0
  65. package/dist/lib/agent-result.d.ts.map +1 -0
  66. package/dist/lib/agent-result.js +2 -0
  67. package/dist/lib/agent-result.js.map +1 -0
  68. package/dist/lib/comment-poster.d.ts +1 -1
  69. package/dist/lib/comment-poster.d.ts.map +1 -1
  70. package/dist/lib/comment-poster.js +38 -16
  71. package/dist/lib/comment-poster.js.map +1 -1
  72. package/dist/lib/config.d.ts +27 -1
  73. package/dist/lib/config.d.ts.map +1 -1
  74. package/dist/lib/config.js +17 -0
  75. package/dist/lib/config.js.map +1 -1
  76. package/dist/lib/error-comment-poster.d.ts +1 -1
  77. package/dist/lib/error-comment-poster.d.ts.map +1 -1
  78. package/dist/lib/error-comment-poster.js +15 -7
  79. package/dist/lib/error-comment-poster.js.map +1 -1
  80. package/dist/lib/okf-wiki.d.ts +65 -0
  81. package/dist/lib/okf-wiki.d.ts.map +1 -0
  82. package/dist/lib/okf-wiki.js +647 -0
  83. package/dist/lib/okf-wiki.js.map +1 -0
  84. package/dist/lib/output-paths.d.ts +0 -1
  85. package/dist/lib/output-paths.d.ts.map +1 -1
  86. package/dist/lib/output-paths.js +0 -1
  87. package/dist/lib/output-paths.js.map +1 -1
  88. package/dist/lib/platform-client.d.ts +2 -0
  89. package/dist/lib/platform-client.d.ts.map +1 -1
  90. package/dist/lib/project-setup.d.ts +7 -0
  91. package/dist/lib/project-setup.d.ts.map +1 -0
  92. package/dist/lib/project-setup.js +11 -0
  93. package/dist/lib/project-setup.js.map +1 -0
  94. package/dist/lib/review-artifact-store.d.ts +16 -0
  95. package/dist/lib/review-artifact-store.d.ts.map +1 -0
  96. package/dist/lib/review-artifact-store.js +84 -0
  97. package/dist/lib/review-artifact-store.js.map +1 -0
  98. package/dist/lib/review-artifact.d.ts +11 -1
  99. package/dist/lib/review-artifact.d.ts.map +1 -1
  100. package/dist/lib/review-artifact.js +203 -0
  101. package/dist/lib/review-artifact.js.map +1 -1
  102. package/dist/lib/review-core.d.ts +1 -0
  103. package/dist/lib/review-core.d.ts.map +1 -1
  104. package/dist/lib/review-core.js +11 -14
  105. package/dist/lib/review-core.js.map +1 -1
  106. package/dist/lib/review-orchestrator.d.ts +6 -1
  107. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  108. package/dist/lib/review-orchestrator.js +3 -1
  109. package/dist/lib/review-orchestrator.js.map +1 -1
  110. package/dist/lib/review-parser.d.ts.map +1 -1
  111. package/dist/lib/review-parser.js +15 -12
  112. package/dist/lib/review-parser.js.map +1 -1
  113. package/dist/lib/wiki-delta.d.ts +71 -0
  114. package/dist/lib/wiki-delta.d.ts.map +1 -0
  115. package/dist/lib/wiki-delta.js +524 -0
  116. package/dist/lib/wiki-delta.js.map +1 -0
  117. package/dist/lib/wiki-run-summary.d.ts +45 -0
  118. package/dist/lib/wiki-run-summary.d.ts.map +1 -0
  119. package/dist/lib/wiki-run-summary.js +168 -0
  120. package/dist/lib/wiki-run-summary.js.map +1 -0
  121. package/dist/lib/wiki-search.d.ts +24 -0
  122. package/dist/lib/wiki-search.d.ts.map +1 -0
  123. package/dist/lib/wiki-search.js +200 -0
  124. package/dist/lib/wiki-search.js.map +1 -0
  125. package/dist/lib/wiki-site-graph.d.ts +33 -0
  126. package/dist/lib/wiki-site-graph.d.ts.map +1 -0
  127. package/dist/lib/wiki-site-graph.js +446 -0
  128. package/dist/lib/wiki-site-graph.js.map +1 -0
  129. package/dist/lib/wiki-site-safety.d.ts +6 -0
  130. package/dist/lib/wiki-site-safety.d.ts.map +1 -0
  131. package/dist/lib/wiki-site-safety.js +83 -0
  132. package/dist/lib/wiki-site-safety.js.map +1 -0
  133. package/dist/lib/wiki-site-smoke.d.ts +16 -0
  134. package/dist/lib/wiki-site-smoke.d.ts.map +1 -0
  135. package/dist/lib/wiki-site-smoke.js +270 -0
  136. package/dist/lib/wiki-site-smoke.js.map +1 -0
  137. package/dist/lib/wiki-site.d.ts +26 -0
  138. package/dist/lib/wiki-site.d.ts.map +1 -0
  139. package/dist/lib/wiki-site.js +221 -0
  140. package/dist/lib/wiki-site.js.map +1 -0
  141. package/dist/lib/workflow/artifact-store.d.ts +71 -0
  142. package/dist/lib/workflow/artifact-store.d.ts.map +1 -0
  143. package/dist/lib/workflow/artifact-store.js +121 -0
  144. package/dist/lib/workflow/artifact-store.js.map +1 -0
  145. package/dist/lib/workflow/compiled-plan.d.ts +87 -0
  146. package/dist/lib/workflow/compiled-plan.d.ts.map +1 -0
  147. package/dist/lib/workflow/compiled-plan.js +62 -0
  148. package/dist/lib/workflow/compiled-plan.js.map +1 -0
  149. package/dist/lib/workflow/executor.d.ts +18 -0
  150. package/dist/lib/workflow/executor.d.ts.map +1 -0
  151. package/dist/lib/workflow/executor.js +2 -0
  152. package/dist/lib/workflow/executor.js.map +1 -0
  153. package/dist/lib/workflow/graph.d.ts +30 -0
  154. package/dist/lib/workflow/graph.d.ts.map +1 -0
  155. package/dist/lib/workflow/graph.js +139 -0
  156. package/dist/lib/workflow/graph.js.map +1 -0
  157. package/dist/lib/workflow/input.d.ts +4 -0
  158. package/dist/lib/workflow/input.d.ts.map +1 -0
  159. package/dist/lib/workflow/input.js +4 -0
  160. package/dist/lib/workflow/input.js.map +1 -0
  161. package/dist/lib/workflow/node-executor.d.ts +19 -0
  162. package/dist/lib/workflow/node-executor.d.ts.map +1 -0
  163. package/dist/lib/workflow/node-executor.js +2 -0
  164. package/dist/lib/workflow/node-executor.js.map +1 -0
  165. package/dist/lib/workflow/planning.d.ts +52 -0
  166. package/dist/lib/workflow/planning.d.ts.map +1 -0
  167. package/dist/lib/workflow/planning.js +865 -0
  168. package/dist/lib/workflow/planning.js.map +1 -0
  169. package/dist/lib/workflow/types.d.ts +71 -0
  170. package/dist/lib/workflow/types.d.ts.map +1 -0
  171. package/dist/lib/workflow/types.js +2 -0
  172. package/dist/lib/workflow/types.js.map +1 -0
  173. package/dist/lib/workflow-artifacts.d.ts.map +1 -1
  174. package/dist/lib/workflow-artifacts.js +23 -1
  175. package/dist/lib/workflow-artifacts.js.map +1 -1
  176. package/dist/lib/write-json-output.d.ts.map +1 -1
  177. package/dist/lib/write-json-output.js +3 -8
  178. package/dist/lib/write-json-output.js.map +1 -1
  179. package/dist/pi/sdk.d.ts.map +1 -1
  180. package/dist/pi/sdk.js +276 -19
  181. package/dist/pi/sdk.js.map +1 -1
  182. package/dist/runtime/client.d.ts +3 -0
  183. package/dist/runtime/client.d.ts.map +1 -1
  184. package/dist/runtime/client.js +4 -0
  185. package/dist/runtime/client.js.map +1 -1
  186. package/dist/temporal/activities.d.ts +26 -0
  187. package/dist/temporal/activities.d.ts.map +1 -0
  188. package/dist/temporal/activities.js +219 -0
  189. package/dist/temporal/activities.js.map +1 -0
  190. package/dist/temporal/config.d.ts +4 -0
  191. package/dist/temporal/config.d.ts.map +1 -0
  192. package/dist/temporal/config.js +36 -0
  193. package/dist/temporal/config.js.map +1 -0
  194. package/dist/temporal/executor.d.ts +7 -0
  195. package/dist/temporal/executor.d.ts.map +1 -0
  196. package/dist/temporal/executor.js +240 -0
  197. package/dist/temporal/executor.js.map +1 -0
  198. package/dist/temporal/retry-policy.d.ts +28 -0
  199. package/dist/temporal/retry-policy.d.ts.map +1 -0
  200. package/dist/temporal/retry-policy.js +61 -0
  201. package/dist/temporal/retry-policy.js.map +1 -0
  202. package/dist/temporal/types.d.ts +86 -0
  203. package/dist/temporal/types.d.ts.map +1 -0
  204. package/dist/temporal/types.js +2 -0
  205. package/dist/temporal/types.js.map +1 -0
  206. package/dist/temporal/worker.d.ts +3 -0
  207. package/dist/temporal/worker.d.ts.map +1 -0
  208. package/dist/temporal/worker.js +18 -0
  209. package/dist/temporal/worker.js.map +1 -0
  210. package/dist/temporal/workflow-id.d.ts +27 -0
  211. package/dist/temporal/workflow-id.d.ts.map +1 -0
  212. package/dist/temporal/workflow-id.js +53 -0
  213. package/dist/temporal/workflow-id.js.map +1 -0
  214. package/dist/temporal/workflows.d.ts +6 -0
  215. package/dist/temporal/workflows.d.ts.map +1 -0
  216. package/dist/temporal/workflows.js +355 -0
  217. package/dist/temporal/workflows.js.map +1 -0
  218. package/package.json +24 -9
@@ -0,0 +1,358 @@
1
+ import { createHash } from 'crypto';
2
+ import { execFile } from 'child_process';
3
+ import { lstat, readFile, readlink, realpath } from 'fs/promises';
4
+ import { isAbsolute, relative, resolve, sep } from 'path';
5
+ import { minimatch } from 'minimatch';
6
+ import { promisify } from 'util';
7
+ const execFileAsync = promisify(execFile);
8
+ const PERMISSION_FIELDS = new Set(['filesystem', 'shell']);
9
+ const FILESYSTEM_FIELDS = new Set(['read', 'write', 'delete']);
10
+ const PATH_PERMISSION_FIELDS = new Set(['roots', 'allow', 'deny']);
11
+ const VALIDATION_FIELDS = new Set(['afterMutation']);
12
+ const AFTER_WRITE_VALIDATOR_FIELDS = new Set(['name', 'root']);
13
+ export function validateAgentPermissions(value, subject = 'Agent permissions') {
14
+ if (!isRecord(value))
15
+ throw new Error(`${subject} must be an object.`);
16
+ rejectUnknownFields(value, PERMISSION_FIELDS, subject);
17
+ if (value.shell !== undefined && typeof value.shell !== 'boolean') {
18
+ throw new Error(`${subject}.shell must be boolean.`);
19
+ }
20
+ if (value.filesystem === undefined)
21
+ return;
22
+ if (!isRecord(value.filesystem)) {
23
+ throw new Error(`${subject}.filesystem must be an object.`);
24
+ }
25
+ rejectUnknownFields(value.filesystem, FILESYSTEM_FIELDS, `${subject}.filesystem`);
26
+ if (value.shell !== false) {
27
+ throw new Error(`${subject} with filesystem rules must explicitly set shell: false.`);
28
+ }
29
+ for (const operation of ['read', 'write', 'delete']) {
30
+ const rule = value.filesystem[operation];
31
+ if (rule === undefined)
32
+ continue;
33
+ validatePathPermissions(rule, `${subject}.filesystem.${operation}`);
34
+ }
35
+ }
36
+ export function validateAgentValidation(value, subject = 'Agent validation') {
37
+ if (!isRecord(value))
38
+ throw new Error(`${subject} must be an object.`);
39
+ rejectUnknownFields(value, VALIDATION_FIELDS, subject);
40
+ if (value.afterMutation === undefined)
41
+ return;
42
+ if (!Array.isArray(value.afterMutation)) {
43
+ throw new Error(`${subject}.afterMutation must be an array.`);
44
+ }
45
+ for (const [index, validator] of value.afterMutation.entries()) {
46
+ const validatorSubject = `${subject}.afterMutation[${index}]`;
47
+ if (!isRecord(validator))
48
+ throw new Error(`${validatorSubject} must be an object.`);
49
+ rejectUnknownFields(validator, AFTER_WRITE_VALIDATOR_FIELDS, validatorSubject);
50
+ if (validator.name !== 'okf-document') {
51
+ throw new Error(`${validatorSubject}.name has unsupported validator "${String(validator.name)}".`);
52
+ }
53
+ if (typeof validator.root !== 'string' || !validator.root.trim()) {
54
+ throw new Error(`${validatorSubject}.root must be a non-empty string.`);
55
+ }
56
+ }
57
+ }
58
+ export function renderAgentPermissions(permissions, render) {
59
+ const rendered = {
60
+ ...(permissions.shell !== undefined ? { shell: permissions.shell } : {}),
61
+ ...(permissions.filesystem
62
+ ? {
63
+ filesystem: Object.fromEntries(['read', 'write', 'delete'].flatMap((operation) => {
64
+ const rule = permissions.filesystem?.[operation];
65
+ return rule
66
+ ? [
67
+ [
68
+ operation,
69
+ {
70
+ roots: rule.roots.map(render),
71
+ allow: rule.allow.map(render),
72
+ ...(rule.deny ? { deny: rule.deny.map(render) } : {}),
73
+ },
74
+ ],
75
+ ]
76
+ : [];
77
+ })),
78
+ }
79
+ : {}),
80
+ };
81
+ validateAgentPermissions(rendered);
82
+ return rendered;
83
+ }
84
+ export function renderAgentValidation(validation, render) {
85
+ const rendered = {
86
+ ...(validation.afterMutation
87
+ ? {
88
+ afterMutation: validation.afterMutation.map((validator) => ({
89
+ name: validator.name,
90
+ root: render(validator.root),
91
+ })),
92
+ }
93
+ : {}),
94
+ };
95
+ validateAgentValidation(rendered);
96
+ return rendered;
97
+ }
98
+ export class AgentFilesystemAuthorizer {
99
+ permissions;
100
+ workingDir;
101
+ constructor(workingDir, permissions) {
102
+ this.permissions = permissions;
103
+ this.workingDir = resolve(workingDir);
104
+ }
105
+ hasRule(operation) {
106
+ return this.permissions[operation] !== undefined;
107
+ }
108
+ async authorize(operation, requestedPath) {
109
+ const rule = this.permissions[operation];
110
+ const absolutePath = isAbsolute(requestedPath)
111
+ ? resolve(requestedPath)
112
+ : resolve(this.workingDir, requestedPath);
113
+ const relativePath = relative(this.workingDir, absolutePath);
114
+ if ((relativePath === '' && operation !== 'read') ||
115
+ relativePath === '..' ||
116
+ relativePath.startsWith(`..${sep}`) ||
117
+ isAbsolute(relativePath)) {
118
+ throw permissionError(operation, requestedPath, 'path is outside the working directory');
119
+ }
120
+ if (rule) {
121
+ const scopedPaths = rule.roots.flatMap((root) => {
122
+ const absoluteRoot = resolve(this.workingDir, root);
123
+ const scopedPath = relative(absoluteRoot, absolutePath);
124
+ return scopedPath === '' || (!scopedPath.startsWith(`..${sep}`) && !isAbsolute(scopedPath))
125
+ ? [toPosixPath(scopedPath)]
126
+ : [];
127
+ });
128
+ if (scopedPaths.length === 0) {
129
+ throw permissionError(operation, requestedPath, 'path is outside the allowed roots');
130
+ }
131
+ const allowed = scopedPaths.some((scopedPath) => rule.allow.some((pattern) => matchesPath(scopedPath, pattern)));
132
+ if (!allowed) {
133
+ throw permissionError(operation, requestedPath, 'path is not in the allow list');
134
+ }
135
+ const denied = scopedPaths.some((scopedPath) => (rule.deny ?? []).some((pattern) => matchesPath(scopedPath, pattern)));
136
+ if (denied) {
137
+ throw permissionError(operation, requestedPath, 'path is in the deny list');
138
+ }
139
+ }
140
+ await assertNoSymbolicLinks(this.workingDir, absolutePath, operation, requestedPath);
141
+ return absolutePath;
142
+ }
143
+ }
144
+ export async function captureAgentWorkspaceSnapshot(workingDir) {
145
+ const root = resolve(workingDir);
146
+ let output;
147
+ try {
148
+ const { stdout: gitRootOutput } = await execFileAsync('git', ['--no-pager', 'rev-parse', '--show-toplevel'], { cwd: root, encoding: 'utf-8' });
149
+ const [gitRoot, workspaceRoot] = await Promise.all([
150
+ realpath(resolve(gitRootOutput.trim())),
151
+ realpath(root),
152
+ ]);
153
+ if (gitRoot !== workspaceRoot) {
154
+ throw new Error(`agent working directory must be the Git repository root (${gitRoot})`);
155
+ }
156
+ ({ stdout: output } = await execFileAsync('git', ['--no-pager', 'ls-files', '--cached', '--others', '--exclude-standard', '-z'], { cwd: root, encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024 }));
157
+ }
158
+ catch (error) {
159
+ throw new Error(`Agent filesystem permissions require a Git repository: ${error instanceof Error ? error.message : String(error)}`);
160
+ }
161
+ const files = Object.create(null);
162
+ for (const filePath of output.split('\0').filter(Boolean).sort()) {
163
+ const fingerprint = await fingerprintWorkspacePath(root, filePath);
164
+ if (fingerprint)
165
+ files[toPosixPath(filePath)] = fingerprint;
166
+ }
167
+ return { files };
168
+ }
169
+ export async function assertAgentWorkspaceChangesAllowed(workingDir, permissions, before) {
170
+ const after = await captureAgentWorkspaceSnapshot(workingDir);
171
+ const changedPaths = [...new Set([...Object.keys(before.files), ...Object.keys(after.files)])]
172
+ .filter((filePath) => before.files[filePath] !== after.files[filePath])
173
+ .sort();
174
+ const changes = {
175
+ added: changedPaths.filter((filePath) => before.files[filePath] === undefined),
176
+ modified: changedPaths.filter((filePath) => before.files[filePath] !== undefined && after.files[filePath] !== undefined),
177
+ deleted: changedPaths.filter((filePath) => after.files[filePath] === undefined),
178
+ };
179
+ if (changedPaths.length === 0)
180
+ return changes;
181
+ if (!permissions.write && !permissions.delete) {
182
+ throw new Error(`Agent changed path(s) without filesystem write permission:\n${changedPaths.map((filePath) => `- ${filePath}`).join('\n')}`);
183
+ }
184
+ const authorizer = new AgentFilesystemAuthorizer(workingDir, permissions);
185
+ const denied = [];
186
+ for (const filePath of changedPaths) {
187
+ const operation = before.files[filePath] !== undefined && after.files[filePath] === undefined
188
+ ? 'delete'
189
+ : 'write';
190
+ if (!permissions[operation]) {
191
+ denied.push({ path: filePath, reason: `Agent has no filesystem ${operation} permission.` });
192
+ continue;
193
+ }
194
+ try {
195
+ await authorizer.authorize(operation, filePath);
196
+ }
197
+ catch (error) {
198
+ denied.push({
199
+ path: filePath,
200
+ reason: error instanceof Error ? error.message : String(error),
201
+ });
202
+ }
203
+ }
204
+ if (denied.length > 0) {
205
+ throw new Error(`Agent changed path(s) outside its filesystem permissions:\n${denied.map(({ path, reason }) => `- ${path}: ${reason}`).join('\n')}`);
206
+ }
207
+ return changes;
208
+ }
209
+ function validatePathPermissions(value, subject) {
210
+ if (!isRecord(value))
211
+ throw new Error(`${subject} must be an object.`);
212
+ rejectUnknownFields(value, PATH_PERMISSION_FIELDS, subject);
213
+ validateLiteralRoots(value.roots, `${subject}.roots`);
214
+ validatePathPatterns(value.allow, `${subject}.allow`, true);
215
+ if (value.deny !== undefined)
216
+ validatePathPatterns(value.deny, `${subject}.deny`, false);
217
+ }
218
+ function validateLiteralRoots(value, subject) {
219
+ if (!Array.isArray(value) || value.length === 0) {
220
+ throw new Error(`${subject} must contain at least one repository-relative path.`);
221
+ }
222
+ for (const root of value) {
223
+ if (typeof root !== 'string' || !root.trim()) {
224
+ throw new Error(`${subject} must contain only non-empty strings.`);
225
+ }
226
+ const normalized = root.replaceAll('\\', '/');
227
+ if (isAbsolute(root) || normalized.split('/').includes('..')) {
228
+ throw new Error(`${subject} must contain repository-relative paths: ${root}`);
229
+ }
230
+ }
231
+ }
232
+ function validatePathPatterns(value, subject, required) {
233
+ if (!Array.isArray(value)) {
234
+ throw new Error(`${subject} must be an array of repository-relative glob patterns.`);
235
+ }
236
+ if (required && value.length === 0) {
237
+ throw new Error(`${subject} must contain at least one repository-relative glob pattern.`);
238
+ }
239
+ for (const pattern of value) {
240
+ if (typeof pattern !== 'string' || !pattern.trim()) {
241
+ throw new Error(`${subject} must contain only non-empty strings.`);
242
+ }
243
+ const normalized = pattern.replaceAll('\\', '/');
244
+ if (isAbsolute(pattern) || normalized.split('/').includes('..')) {
245
+ throw new Error(`${subject} must contain repository-relative patterns: ${pattern}`);
246
+ }
247
+ }
248
+ }
249
+ function matchesPath(filePath, pattern) {
250
+ const normalizedPattern = pattern.replaceAll('\\', '/').replace(/^\.\//u, '');
251
+ return minimatch(filePath, normalizedPattern, {
252
+ dot: true,
253
+ nocase: false,
254
+ nocomment: true,
255
+ nonegate: true,
256
+ });
257
+ }
258
+ async function assertNoSymbolicLinks(workingDir, targetPath, operation, requestedPath) {
259
+ if ((await lstat(workingDir)).isSymbolicLink()) {
260
+ throw permissionError(operation, requestedPath, 'working directory is a symbolic link');
261
+ }
262
+ const relativePath = relative(workingDir, targetPath);
263
+ let currentPath = workingDir;
264
+ for (const part of relativePath.split(sep).filter(Boolean)) {
265
+ currentPath = resolve(currentPath, part);
266
+ try {
267
+ const pathStat = await lstat(currentPath);
268
+ if (pathStat.isSymbolicLink()) {
269
+ throw permissionError(operation, requestedPath, 'path contains a symbolic link');
270
+ }
271
+ if (operation === 'write' &&
272
+ currentPath === targetPath &&
273
+ pathStat.isFile() &&
274
+ pathStat.nlink > 1) {
275
+ throw permissionError(operation, requestedPath, 'target has multiple hard links');
276
+ }
277
+ }
278
+ catch (error) {
279
+ if (isMissingPathError(error))
280
+ return;
281
+ throw error;
282
+ }
283
+ }
284
+ }
285
+ async function fingerprintWorkspacePath(workingDir, relativePath) {
286
+ const absolutePath = resolve(workingDir, relativePath);
287
+ try {
288
+ const pathStat = await lstat(absolutePath);
289
+ if (pathStat.isSymbolicLink()) {
290
+ return createHash('sha256')
291
+ .update(`symlink:${await readlink(absolutePath)}`)
292
+ .digest('hex');
293
+ }
294
+ if (pathStat.isDirectory())
295
+ return fingerprintNestedGitWorkspace(absolutePath);
296
+ if (!pathStat.isFile())
297
+ return null;
298
+ const hash = createHash('sha256');
299
+ hash.update(`mode:${pathStat.mode & 0o111 ? 'executable' : 'regular'}\0`);
300
+ hash.update(await readFile(absolutePath));
301
+ return hash.digest('hex');
302
+ }
303
+ catch (error) {
304
+ if (isMissingPathError(error))
305
+ return null;
306
+ throw error;
307
+ }
308
+ }
309
+ async function fingerprintNestedGitWorkspace(workingDir) {
310
+ try {
311
+ const [headResult, diffResult, untrackedResult] = await Promise.all([
312
+ execFileAsync('git', ['--no-pager', 'rev-parse', 'HEAD'], {
313
+ cwd: workingDir,
314
+ encoding: 'utf-8',
315
+ }),
316
+ execFileAsync('git', ['--no-pager', 'diff', '--binary', 'HEAD'], {
317
+ cwd: workingDir,
318
+ encoding: 'utf-8',
319
+ maxBuffer: 10 * 1024 * 1024,
320
+ }),
321
+ execFileAsync('git', ['--no-pager', 'ls-files', '--others', '--exclude-standard', '-z'], {
322
+ cwd: workingDir,
323
+ encoding: 'utf-8',
324
+ maxBuffer: 10 * 1024 * 1024,
325
+ }),
326
+ ]);
327
+ const hash = createHash('sha256');
328
+ hash.update(`head:${headResult.stdout.trim()}\0diff:\0${diffResult.stdout}\0`);
329
+ for (const filePath of untrackedResult.stdout.split('\0').filter(Boolean).sort()) {
330
+ const fingerprint = await fingerprintWorkspacePath(workingDir, filePath);
331
+ if (fingerprint)
332
+ hash.update(`untracked:${toPosixPath(filePath)}\0${fingerprint}\0`);
333
+ }
334
+ return hash.digest('hex');
335
+ }
336
+ catch {
337
+ return null;
338
+ }
339
+ }
340
+ function permissionError(operation, requestedPath, reason) {
341
+ return new Error(`Agent filesystem permission denied for ${operation} "${requestedPath}": ${reason}.`);
342
+ }
343
+ function rejectUnknownFields(value, allowed, subject) {
344
+ const unknown = Object.keys(value).filter((key) => !allowed.has(key));
345
+ if (unknown.length > 0) {
346
+ throw new Error(`${subject} has unsupported field(s): ${unknown.join(', ')}.`);
347
+ }
348
+ }
349
+ function toPosixPath(value) {
350
+ return sep === '/' ? value : value.split(sep).join('/');
351
+ }
352
+ function isRecord(value) {
353
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
354
+ }
355
+ function isMissingPathError(error) {
356
+ return isRecord(error) && error.code === 'ENOENT';
357
+ }
358
+ //# sourceMappingURL=agent-permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-permissions.js","sourceRoot":"","sources":["../../src/lib/agent-permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { AgentUsageSummary } from './review-usage.js';
2
+ import type { AgentWorkspaceChanges } from './agent-permissions.js';
3
+ export interface AgentRunResult {
4
+ timestamp: string;
5
+ agent: string;
6
+ response: string;
7
+ usage: AgentUsageSummary;
8
+ workspaceChanges?: AgentWorkspaceChanges;
9
+ }
10
+ //# sourceMappingURL=agent-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-result.d.ts","sourceRoot":"","sources":["../../src/lib/agent-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,iBAAiB,CAAC;IACzB,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;CAC1C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-result.js","sourceRoot":"","sources":["../../src/lib/agent-result.ts"],"names":[],"mappings":""}
@@ -20,5 +20,5 @@ import type { ReviewUsageSummary } from './review-usage.js';
20
20
  * 4. Adds an "ai-reviewed" label
21
21
  * @param cursorFixLinks Optional Cursor link settings for summary and inline issue comments.
22
22
  */
23
- export declare function postReviewComments(platformClient: PlatformClient, projectId: string, prNumber: number, summary: ReturnType<typeof calculateSummary>, issues: ReviewIssue[], changeSummary: ChangeSummary | undefined, reviewUsage: ReviewUsageSummary | undefined, platformData: unknown, lineValidator?: LineValidator, createInlinePosition?: (issue: ReviewIssue, platformData: unknown) => InlineCommentPosition, cursorFixLinks?: CursorFixLinkOptions, reviewMetadata?: ReviewMetadata): Promise<void>;
23
+ export declare function postReviewComments(platformClient: PlatformClient, projectId: string, prNumber: number, summary: ReturnType<typeof calculateSummary>, issues: ReviewIssue[], changeSummary: ChangeSummary | undefined, reviewUsage: ReviewUsageSummary | undefined, platformData: unknown, lineValidator?: LineValidator, createInlinePosition?: (issue: ReviewIssue, platformData: unknown) => InlineCommentPosition, cursorFixLinks?: CursorFixLinkOptions, reviewMetadata?: ReviewMetadata, assertCurrentHead?: () => Promise<void>, beforeLabel?: () => Promise<void>): Promise<void>;
24
24
  //# sourceMappingURL=comment-poster.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"comment-poster.d.ts","sourceRoot":"","sources":["../../src/lib/comment-poster.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AASjE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EAC5C,MAAM,EAAE,WAAW,EAAE,EACrB,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,WAAW,EAAE,kBAAkB,GAAG,SAAS,EAC3C,YAAY,EAAE,OAAO,EACrB,aAAa,CAAC,EAAE,aAAa,EAC7B,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,KAAK,qBAAqB,EAC3F,cAAc,CAAC,EAAE,oBAAoB,EACrC,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,IAAI,CAAC,CAmFf"}
1
+ {"version":3,"file":"comment-poster.d.ts","sourceRoot":"","sources":["../../src/lib/comment-poster.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AASjE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAW5D;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EAC5C,MAAM,EAAE,WAAW,EAAE,EACrB,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,WAAW,EAAE,kBAAkB,GAAG,SAAS,EAC3C,YAAY,EAAE,OAAO,EACrB,aAAa,CAAC,EAAE,aAAa,EAC7B,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,KAAK,qBAAqB,EAC3F,cAAc,CAAC,EAAE,oBAAoB,EACrC,cAAc,CAAC,EAAE,cAAc,EAC/B,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACvC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CAqGf"}
@@ -7,6 +7,13 @@
7
7
  import chalk from 'chalk';
8
8
  import { formatSummaryComment, formatIssueComment, } from './comment-formatter.js';
9
9
  import { BOT_COMMENT_ID, createIssueFingerprint, extractIssueFingerprints, findExistingSummaryComment, prepareIssuesForPosting, } from './comment-manager.js';
10
+ const MAX_PLATFORM_COMMENT_LENGTH = 60_000;
11
+ const MAX_INLINE_COMMENTS_PER_REVIEW = 100;
12
+ function assertPostBodyWithinLimit(body, subject) {
13
+ if (body.length > MAX_PLATFORM_COMMENT_LENGTH) {
14
+ throw new Error(`${subject} exceeds the safe platform comment length.`);
15
+ }
16
+ }
10
17
  /**
11
18
  * Post review comments to a PR/MR
12
19
  *
@@ -17,7 +24,14 @@ import { BOT_COMMENT_ID, createIssueFingerprint, extractIssueFingerprints, findE
17
24
  * 4. Adds an "ai-reviewed" label
18
25
  * @param cursorFixLinks Optional Cursor link settings for summary and inline issue comments.
19
26
  */
20
- export async function postReviewComments(platformClient, projectId, prNumber, summary, issues, changeSummary, reviewUsage, platformData, lineValidator, createInlinePosition, cursorFixLinks, reviewMetadata) {
27
+ export async function postReviewComments(platformClient, projectId, prNumber, summary, issues, changeSummary, reviewUsage, platformData, lineValidator, createInlinePosition, cursorFixLinks, reviewMetadata, assertCurrentHead, beforeLabel) {
28
+ const summaryComment = formatSummaryComment(summary, issues, BOT_COMMENT_ID, changeSummary, reviewUsage, cursorFixLinks, reviewMetadata);
29
+ assertPostBodyWithinLimit(summaryComment, 'Review summary');
30
+ for (const issue of issues) {
31
+ if (issue.severity === 'CRITICAL' || issue.severity === 'HIGH') {
32
+ assertPostBodyWithinLimit(formatIssueComment(issue, createIssueFingerprint(issue), cursorFixLinks), 'Inline review comment');
33
+ }
34
+ }
21
35
  console.log(chalk.gray('Fetching existing comments...\n'));
22
36
  // Fetch existing comments to prevent duplicates
23
37
  const [existingComments, existingInlineComments] = await Promise.all([
@@ -30,18 +44,6 @@ export async function postReviewComments(platformClient, projectId, prNumber, su
30
44
  ...existingInlineComments.map((c) => ({ id: c.id, body: c.body })),
31
45
  ];
32
46
  const existingSummary = findExistingSummaryComment(existingComments.map((c) => ({ id: c.id, body: c.body })));
33
- await removeStaleInlineIssueComments(platformClient, projectId, prNumber, existingInlineComments.map((c) => ({ id: c.id, body: c.body })), issues);
34
- // Post or update summary comment
35
- console.log(chalk.gray('Posting review summary...\n'));
36
- const summaryComment = formatSummaryComment(summary, issues, BOT_COMMENT_ID, changeSummary, reviewUsage, cursorFixLinks, reviewMetadata);
37
- if (existingSummary) {
38
- await platformClient.updateComment(projectId, prNumber, existingSummary.id, summaryComment);
39
- console.log(chalk.green('✓ Updated existing review summary'));
40
- }
41
- else {
42
- await platformClient.createComment(projectId, prNumber, summaryComment);
43
- console.log(chalk.green('✓ Posted new review summary'));
44
- }
45
47
  // Prepare issues for posting: filter to CRITICAL/HIGH, deduplicate, validate lines
46
48
  const criticalHighCount = issues.filter((i) => i.severity === 'CRITICAL' || i.severity === 'HIGH').length;
47
49
  const prepared = prepareIssuesForPosting(issues, allComments, (issue) => {
@@ -55,14 +57,34 @@ export async function postReviewComments(platformClient, projectId, prNumber, su
55
57
  if (!createInlinePosition) {
56
58
  console.log(chalk.yellow(`⚠ Inline comments disabled (no position builder configured)\n`));
57
59
  }
58
- if (prepared.inlineIssues.length > 0 && createInlinePosition) {
59
- const inlineComments = prepared.inlineIssues.map((issue) => ({
60
+ const inlineComments = createInlinePosition
61
+ ? prepared.inlineIssues.map((issue) => ({
60
62
  body: formatIssueComment(issue, createIssueFingerprint(issue), cursorFixLinks),
61
63
  position: createInlinePosition(issue, platformData),
62
- }));
64
+ }))
65
+ : [];
66
+ if (inlineComments.length > MAX_INLINE_COMMENTS_PER_REVIEW) {
67
+ throw new Error('Review has too many inline comments for one platform request.');
68
+ }
69
+ await assertCurrentHead?.();
70
+ console.log(chalk.gray('Posting review summary...\n'));
71
+ if (existingSummary) {
72
+ await platformClient.updateComment(projectId, prNumber, existingSummary.id, summaryComment);
73
+ console.log(chalk.green('✓ Updated existing review summary'));
74
+ }
75
+ else {
76
+ await platformClient.createComment(projectId, prNumber, summaryComment);
77
+ console.log(chalk.green('✓ Posted new review summary'));
78
+ }
79
+ await assertCurrentHead?.();
80
+ await removeStaleInlineIssueComments(platformClient, projectId, prNumber, existingInlineComments.map((c) => ({ id: c.id, body: c.body })), issues);
81
+ if (inlineComments.length > 0) {
82
+ await assertCurrentHead?.();
63
83
  await platformClient.createBulkInlineComments(projectId, prNumber, inlineComments);
64
84
  }
65
85
  // Add ai-reviewed label
86
+ await beforeLabel?.();
87
+ await assertCurrentHead?.();
66
88
  await platformClient.addLabels(projectId, prNumber, ['ai-reviewed']);
67
89
  console.log(chalk.green('✓ Review posted\n'));
68
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"comment-poster.js","sourceRoot":"","sources":["../../src/lib/comment-poster.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GAGnB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,GAExB,MAAM,sBAAsB,CAAC;AAI9B;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,cAA8B,EAC9B,SAAiB,EACjB,QAAgB,EAChB,OAA4C,EAC5C,MAAqB,EACrB,aAAwC,EACxC,WAA2C,EAC3C,YAAqB,EACrB,aAA6B,EAC7B,oBAA2F,EAC3F,cAAqC,EACrC,cAA+B;IAE/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAE3D,gDAAgD;IAChD,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACnE,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC/C,cAAc,CAAC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC;KACtD,CAAC,CAAC;IAEH,oCAAoC;IACpC,MAAM,WAAW,GAAsB;QACrC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;KACnE,CAAC;IAEF,MAAM,eAAe,GAAG,0BAA0B,CAChD,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAC1D,CAAC;IAEF,MAAM,8BAA8B,CAClC,cAAc,EACd,SAAS,EACT,QAAQ,EACR,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAC/D,MAAM,CACP,CAAC;IAEF,iCAAiC;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,oBAAoB,CACzC,OAAO,EACP,MAAM,EACN,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,CACf,CAAC;IAEF,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,cAAc,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,MAAM,cAAc,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,mFAAmF;IACnF,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAC1D,CAAC,MAAM,CAAC;IAET,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QACtE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QAChD,OAAO,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,qDAAqD;IACrD,2BAA2B,CACzB,iBAAiB,EACjB,QAAQ,CAAC,iBAAiB,EAC1B,QAAQ,CAAC,YAAY,CAAC,MAAM,EAC5B,MAAM,CACP,CAAC;IAEF,oDAAoD;IACpD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,oBAAoB,EAAE,CAAC;QAC7D,MAAM,cAAc,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3D,IAAI,EAAE,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;YAC9E,QAAQ,EAAE,oBAAoB,CAAC,KAAK,EAAE,YAAY,CAAC;SACpD,CAAC,CAAC,CAAC;QAEJ,MAAM,cAAc,CAAC,wBAAwB,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IACrF,CAAC;IAED,wBAAwB;IACxB,MAAM,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAErE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,cAA8B,EAC9B,SAAiB,EACjB,QAAgB,EAChB,sBAAyC,EACzC,MAAqB;IAErB,MAAM,mBAAmB,GAAG,IAAI,GAAG,CACjC,MAAM;SACH,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC;SAC7E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CACjD,CAAC;IAEF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,OAAO,IAAI,sBAAsB,EAAE,CAAC;QAC7C,MAAM,YAAY,GAAG,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAC1D,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CACrC,CAAC;QACF,IAAI,YAAY,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,6CAA6C,OAAO,CAAC,EAAE,KACrD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,gCAAgC,CAAC,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAClC,iBAAyB,EACzB,iBAAyB,EACzB,iBAAyB,EACzB,SAAwB;IAExB,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,iBAAiB,iCAAiC,CAAC,CAAC,CAAC;QAEhG,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,iBAAiB,gCAAgC,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;YACpD,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAC5C,CAAC,MAAM,CAAC;QACT,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,kBAAkB,mCAAmC,CAAC,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,mBAAmB,GACvB,iBAAiB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;QACjF,IAAI,mBAAmB,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,mBAAmB,mCAAmC,CAAC,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,iBAAiB,sCAAsC,CAAC,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iDAAiD,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CACzF,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"comment-poster.js","sourceRoot":"","sources":["../../src/lib/comment-poster.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- export declare const SUPPORTED_WORKFLOW_ACTIONS: readonly ["write", "git-diff", "git-add", "git-branch", "git-commit", "git-push", "has-diff", "stack-guard", "review-threshold", "save-artifact", "load-artifact", "artifact-exists", "create-review-artifact", "review-artifact-status", "review-artifact-add-finding", "review-artifact-update-findings", "verify-fix", "review-artifact-promote-finding", "review-artifact-resolve-finding", "create-change-request", "create-pr", "create-mr", "change-source", "review", "review-context", "describe", "code-quality-report", "post-comment", "post-review-comments", "post-fix-status"];
1
+ import { type AgentPermissions, type AgentValidation } from './agent-permissions.js';
2
+ export declare const SUPPORTED_WORKFLOW_ACTIONS: readonly ["write", "git-diff", "git-add", "git-branch", "git-commit", "git-push", "has-diff", "stack-guard", "review-threshold", "save-artifact", "load-artifact", "artifact-exists", "create-review-artifact", "review-artifact-status", "review-artifact-add-finding", "review-artifact-update-findings", "verify-fix", "review-artifact-promote-finding", "review-artifact-resolve-finding", "create-change-request", "create-pr", "create-mr", "change-source", "review", "review-context", "describe", "code-quality-report", "plan-wiki-update", "sync-okf-indexes", "validate-okf-wiki", "summarize-wiki-run", "record-wiki-state", "check-wiki-state", "check-wiki-clean", "post-comment", "post-review-comments", "post-fix-status"];
2
3
  export type WorkflowAction = (typeof SUPPORTED_WORKFLOW_ACTIONS)[number];
3
4
  /**
4
5
  * Agent reference - supports both simple string and detailed object format.
@@ -62,14 +63,29 @@ export interface WorkflowNodeConfig {
62
63
  writes?: string;
63
64
  /** Emit JSON for an agent node when writing to a file. */
64
65
  json?: boolean;
66
+ /** Runtime-enforced capabilities for this agent invocation. */
67
+ permissions?: AgentPermissions;
68
+ /** Content validators run inside policy-aware mutation tools. */
69
+ validation?: AgentValidation;
65
70
  }
66
71
  export interface WorkflowConfig {
67
72
  description?: string;
73
+ metadata?: WorkflowMetadata;
68
74
  inputs?: Record<string, WorkflowInputConfig>;
69
75
  /** Artifact key to expose as the workflow output. Defaults to the last node output. */
70
76
  output?: string;
71
77
  nodes: Record<string, WorkflowNodeConfig>;
72
78
  }
79
+ export interface WorkflowMetadata {
80
+ kind?: string;
81
+ tags?: string[];
82
+ review?: {
83
+ source?: string;
84
+ diff?: boolean;
85
+ issues?: boolean;
86
+ };
87
+ [key: string]: unknown;
88
+ }
73
89
  export type WorkflowSource = 'packaged' | 'project';
74
90
  export interface AgentDefaultsConfig {
75
91
  model?: string;
@@ -206,6 +222,16 @@ export interface DRSConfig {
206
222
  workflow?: {
207
223
  default?: string;
208
224
  };
225
+ temporal?: {
226
+ address?: string;
227
+ namespace?: string;
228
+ taskQueue?: string;
229
+ workflowIdPrefix?: string;
230
+ workspace?: {
231
+ mode?: 'local' | 'managed';
232
+ root?: string;
233
+ };
234
+ };
209
235
  /**
210
236
  * @deprecated Use `pi` instead. Kept as a compatibility alias for legacy configs.
211
237
  */