agentplane 0.3.16 → 0.3.17

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 (123) hide show
  1. package/dist/.build-manifest.json +159 -54
  2. package/dist/backends/task-backend/redmine/backend-runtime.d.ts +4 -146
  3. package/dist/backends/task-backend/redmine/backend-runtime.d.ts.map +1 -1
  4. package/dist/backends/task-backend/redmine/backend-runtime.js +4 -258
  5. package/dist/backends/task-backend/redmine/mapping.js +1 -1
  6. package/dist/backends/task-backend/redmine/runtime-context.d.ts +98 -0
  7. package/dist/backends/task-backend/redmine/runtime-context.d.ts.map +1 -0
  8. package/dist/backends/task-backend/redmine/runtime-context.js +57 -0
  9. package/dist/backends/task-backend/redmine/runtime-methods.d.ts +33 -0
  10. package/dist/backends/task-backend/redmine/runtime-methods.d.ts.map +1 -0
  11. package/dist/backends/task-backend/redmine/runtime-methods.js +86 -0
  12. package/dist/backends/task-backend/redmine/runtime-operations.d.ts +19 -0
  13. package/dist/backends/task-backend/redmine/runtime-operations.d.ts.map +1 -0
  14. package/dist/backends/task-backend/redmine/runtime-operations.js +83 -0
  15. package/dist/backends/task-backend/redmine/runtime-state.d.ts +10 -0
  16. package/dist/backends/task-backend/redmine/runtime-state.d.ts.map +1 -0
  17. package/dist/backends/task-backend/redmine/runtime-state.js +45 -0
  18. package/dist/backends/task-backend/shared/constants.d.ts +1 -1
  19. package/dist/backends/task-backend/shared/constants.d.ts.map +1 -1
  20. package/dist/backends/task-backend/shared/constants.js +1 -1
  21. package/dist/backends/task-index.d.ts +0 -4
  22. package/dist/backends/task-index.d.ts.map +1 -1
  23. package/dist/backends/task-index.js +0 -33
  24. package/dist/cli/exit-codes.d.ts.map +1 -1
  25. package/dist/cli/exit-codes.js +1 -0
  26. package/dist/cli/http.d.ts.map +1 -1
  27. package/dist/cli/http.js +34 -15
  28. package/dist/cli/run-cli/command-loaders.d.ts +1 -5
  29. package/dist/cli/run-cli/command-loaders.d.ts.map +1 -1
  30. package/dist/cli/spec/errors.d.ts +5 -0
  31. package/dist/cli/spec/errors.d.ts.map +1 -1
  32. package/dist/cli/spec/errors.js +14 -1
  33. package/dist/cli/spec/parse.d.ts.map +1 -1
  34. package/dist/cli/spec/parse.js +8 -1
  35. package/dist/commands/branch/work-start.d.ts.map +1 -1
  36. package/dist/commands/branch/work-start.direct.d.ts +13 -0
  37. package/dist/commands/branch/work-start.direct.d.ts.map +1 -0
  38. package/dist/commands/branch/work-start.direct.js +75 -0
  39. package/dist/commands/branch/work-start.git.d.ts +3 -0
  40. package/dist/commands/branch/work-start.git.d.ts.map +1 -0
  41. package/dist/commands/branch/work-start.git.js +19 -0
  42. package/dist/commands/branch/work-start.hook-shim.d.ts +2 -0
  43. package/dist/commands/branch/work-start.hook-shim.d.ts.map +1 -0
  44. package/dist/commands/branch/work-start.hook-shim.js +38 -0
  45. package/dist/commands/branch/work-start.js +6 -235
  46. package/dist/commands/branch/work-start.materialize.d.ts +16 -0
  47. package/dist/commands/branch/work-start.materialize.d.ts.map +1 -0
  48. package/dist/commands/branch/work-start.materialize.js +110 -0
  49. package/dist/commands/doctor/fixes.d.ts +0 -5
  50. package/dist/commands/doctor/fixes.d.ts.map +1 -1
  51. package/dist/commands/doctor/fixes.js +0 -70
  52. package/dist/commands/doctor/workflow.d.ts.map +1 -1
  53. package/dist/commands/doctor/workflow.js +2 -23
  54. package/dist/commands/doctor.run.d.ts.map +1 -1
  55. package/dist/commands/doctor.run.js +1 -3
  56. package/dist/commands/hooks/index.d.ts +4 -20
  57. package/dist/commands/hooks/index.d.ts.map +1 -1
  58. package/dist/commands/hooks/index.js +4 -432
  59. package/dist/commands/hooks/install.d.ts +11 -0
  60. package/dist/commands/hooks/install.d.ts.map +1 -0
  61. package/dist/commands/hooks/install.js +136 -0
  62. package/dist/commands/hooks/run.commit-msg.d.ts +3 -0
  63. package/dist/commands/hooks/run.commit-msg.d.ts.map +1 -0
  64. package/dist/commands/hooks/run.commit-msg.js +67 -0
  65. package/dist/commands/hooks/run.d.ts +9 -0
  66. package/dist/commands/hooks/run.d.ts.map +1 -0
  67. package/dist/commands/hooks/run.js +45 -0
  68. package/dist/commands/hooks/run.post-merge.d.ts +3 -0
  69. package/dist/commands/hooks/run.post-merge.d.ts.map +1 -0
  70. package/dist/commands/hooks/run.post-merge.js +44 -0
  71. package/dist/commands/hooks/run.pre-commit.d.ts +3 -0
  72. package/dist/commands/hooks/run.pre-commit.d.ts.map +1 -0
  73. package/dist/commands/hooks/run.pre-commit.js +48 -0
  74. package/dist/commands/hooks/run.pre-push.d.ts +6 -0
  75. package/dist/commands/hooks/run.pre-push.d.ts.map +1 -0
  76. package/dist/commands/hooks/run.pre-push.js +88 -0
  77. package/dist/commands/hooks/shared.d.ts +7 -0
  78. package/dist/commands/hooks/shared.d.ts.map +1 -0
  79. package/dist/commands/hooks/shared.js +41 -0
  80. package/dist/commands/recipes/impl/index.d.ts.map +1 -1
  81. package/dist/commands/recipes/impl/index.js +13 -3
  82. package/dist/commands/task/hosted-close-pr.command.d.ts +2 -7
  83. package/dist/commands/task/hosted-close-pr.command.d.ts.map +1 -1
  84. package/dist/commands/task/hosted-close-pr.command.js +9 -373
  85. package/dist/commands/task/hosted-close-pr.execute.d.ts +3 -0
  86. package/dist/commands/task/hosted-close-pr.execute.d.ts.map +1 -0
  87. package/dist/commands/task/hosted-close-pr.execute.js +135 -0
  88. package/dist/commands/task/hosted-close-pr.postcheck.d.ts +3 -0
  89. package/dist/commands/task/hosted-close-pr.postcheck.d.ts.map +1 -0
  90. package/dist/commands/task/hosted-close-pr.postcheck.js +13 -0
  91. package/dist/commands/task/hosted-close-pr.precheck.d.ts +4 -0
  92. package/dist/commands/task/hosted-close-pr.precheck.d.ts.map +1 -0
  93. package/dist/commands/task/hosted-close-pr.precheck.js +288 -0
  94. package/dist/commands/task/hosted-close-pr.report.d.ts +4 -0
  95. package/dist/commands/task/hosted-close-pr.report.d.ts.map +1 -0
  96. package/dist/commands/task/hosted-close-pr.report.js +42 -0
  97. package/dist/commands/task/hosted-close-pr.types.d.ts +75 -0
  98. package/dist/commands/task/hosted-close-pr.types.d.ts.map +1 -0
  99. package/dist/commands/task/hosted-close-pr.types.js +1 -0
  100. package/dist/commands/upgrade/materialize.d.ts.map +1 -1
  101. package/dist/commands/upgrade/materialize.js +0 -7
  102. package/dist/commands/upgrade/source.d.ts +0 -1
  103. package/dist/commands/upgrade/source.d.ts.map +1 -1
  104. package/dist/commands/upgrade/source.js +1 -9
  105. package/dist/runner/context/base-prompts.d.ts.map +1 -1
  106. package/dist/runner/context/base-prompts.js +4 -0
  107. package/dist/runner/context/project-skill-prompt-blocks.d.ts +5 -0
  108. package/dist/runner/context/project-skill-prompt-blocks.d.ts.map +1 -0
  109. package/dist/runner/context/project-skill-prompt-blocks.js +57 -0
  110. package/dist/runner/process-supervision/run.d.ts.map +1 -1
  111. package/dist/runner/process-supervision/run.js +61 -59
  112. package/dist/shared/errors.d.ts +4 -1
  113. package/dist/shared/errors.d.ts.map +1 -1
  114. package/dist/shared/errors.js +6 -0
  115. package/dist/shared/workflow-artifacts.d.ts.map +1 -1
  116. package/dist/shared/workflow-artifacts.js +1 -8
  117. package/dist/workflow-runtime/file-ops.d.ts.map +1 -1
  118. package/dist/workflow-runtime/file-ops.js +1 -20
  119. package/dist/workflow-runtime/paths.d.ts.map +1 -1
  120. package/dist/workflow-runtime/paths.js +0 -1
  121. package/dist/workflow-runtime/types.d.ts +0 -1
  122. package/dist/workflow-runtime/types.d.ts.map +1 -1
  123. package/package.json +3 -3
@@ -1,258 +1,4 @@
1
- import { DEFAULT_DOC_UPDATED_BY, DOC_VERSION, BackendError, normalizeDocVersion, nowIso, redmineConfigMissingEnvMessage, toStringSafe, } from "../shared.js";
2
- import { appendCommentNotes as appendCommentNotesImpl, normalizeComments as normalizeCommentsImpl, } from "./comments.js";
3
- import { requestJson as requestRedmineJson } from "./client.js";
4
- import { appendCustomField as appendRedmineCustomField, customFieldValue as redmineCustomFieldValue, setIssueCustomFieldValue as setRedmineIssueCustomFieldValue, } from "./fields.js";
5
- import { doneRatioForStatus, issueToTask as issueToTaskImpl, startDateFromTaskId, taskToIssuePayload as taskToIssuePayloadImpl, } from "./mapping.js";
6
- import { maybeParseJson as maybeParseRedmineJson } from "./parse.js";
7
- import { findIssueByTaskId as findIssueByTaskIdImpl, listTasksRemote as listTasksRemoteImpl, } from "./remote.js";
8
- import { diffRedmineTasks, redmineTasksDiffer } from "./backend-report.js";
9
- export function createRedmineCacheDocContext(host) {
10
- return {
11
- cache: host.cache,
12
- customFields: host.customFields,
13
- ownerAgent: host.ownerAgent,
14
- batchSize: host.batchSize,
15
- findIssueByTaskId: async (taskId) => await host.findIssueByTaskId(taskId),
16
- issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
17
- customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
18
- appendCustomField: (fields, key, value) => host.appendCustomField(fields, key, value),
19
- requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
20
- assertExpectedRevisionSupported: (taskId, opts) => host.assertExpectedRevisionSupported(taskId, opts),
21
- assertExpectedRevision: (taskId, expectedRevision, currentRevision) => host.assertExpectedRevision(taskId, expectedRevision, currentRevision),
22
- cacheTask: async (task, dirty) => await host.cacheTask(task, dirty),
23
- };
24
- }
25
- export function createRedmineReportContext(host) {
26
- return {
27
- projectId: host.projectId,
28
- customFields: host.customFields,
29
- requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
30
- };
31
- }
32
- export function createRedmineSyncContext(host) {
33
- return {
34
- cache: host.cache,
35
- customFields: host.customFields,
36
- ownerAgent: host.ownerAgent,
37
- projectId: host.projectId,
38
- batchSize: host.batchSize,
39
- batchPauseMs: host.batchPauseMs,
40
- statusMap: host.statusMap,
41
- issueCache: host.issueCache,
42
- inferredStatusByTaskStatus: host.inferredStatusByTaskStatus,
43
- setInferredStatusByTaskStatus: host.setInferredStatusByTaskStatus,
44
- listTasksRemote: async () => await host.listTasksRemote(),
45
- writeTask: async (task, opts) => await host.writeTask(task, opts),
46
- writeTasks: async (tasks, opts) => await host.writeTasks(tasks, opts),
47
- findIssueByTaskId: async (taskId) => await host.findIssueByTaskId(taskId),
48
- issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
49
- taskToIssuePayload: (task, existingIssue) => host.taskToIssuePayload(task, existingIssue),
50
- appendCustomField: (fields, key, value) => host.appendCustomField(fields, key, value),
51
- customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
52
- maybeParseJson: (value) => host.maybeParseJson(value),
53
- normalizeComments: (value) => host.normalizeComments(value),
54
- appendCommentNotes: async (issueId, existingComments, desiredComments) => await host.appendCommentNotes(issueId, existingComments, desiredComments),
55
- cacheTask: async (task, dirty) => await host.cacheTask(task, dirty),
56
- assertExpectedRevisionSupported: (taskId, opts) => host.assertExpectedRevisionSupported(taskId, opts),
57
- assertExpectedRevision: (taskId, expectedRevision, currentRevision) => host.assertExpectedRevision(taskId, expectedRevision, currentRevision),
58
- ensureDocMetadata: (task) => host.ensureDocMetadata(task),
59
- diffTasks: (localTask, remoteTask) => host.diffTasks(localTask, remoteTask),
60
- tasksDiffer: (localTask, remoteTask) => host.tasksDiffer(localTask, remoteTask),
61
- taskIdFieldId: () => host.taskIdFieldId(),
62
- setIssueCustomFieldValue: (issue, fieldId, value) => host.setIssueCustomFieldValue(issue, fieldId, value),
63
- requestJson: async (method, reqPath, payload, params, opts) => await host.requestJson(method, reqPath, payload, params, opts),
64
- };
65
- }
66
- export function ensureRedmineDocMetadata(task) {
67
- if (task.doc === undefined)
68
- return;
69
- task.doc_version = normalizeDocVersion(task.doc_version);
70
- task.doc_updated_at ??= nowIso();
71
- task.doc_updated_by ??= DEFAULT_DOC_UPDATED_BY;
72
- }
73
- export async function cacheRedmineTask(host, task, dirty) {
74
- if (!host.cache)
75
- return;
76
- const next = { ...task, dirty };
77
- await host.cache.writeTask(next);
78
- }
79
- export function assertRedmineExpectedRevisionSupported(host, taskId, opts) {
80
- if (opts?.expectedRevision === undefined)
81
- return;
82
- if (host.capabilities.supports_revision_guarded_writes)
83
- return;
84
- throw new BackendError(`Task revision guarding is unavailable for ${taskId} without AGENTPLANE_REDMINE_CUSTOM_FIELDS_CANONICAL_STATE`, "E_BACKEND");
85
- }
86
- export function assertRedmineExpectedRevision(taskId, expectedRevision, currentRevision) {
87
- if (expectedRevision === undefined)
88
- return;
89
- const expected = Math.trunc(expectedRevision);
90
- if (expected <= 0 || expected === currentRevision)
91
- return;
92
- throw new BackendError(`Task revision changed concurrently: ${taskId} ` +
93
- `(expected revision ${expected}, current revision ${currentRevision})`, "E_BACKEND");
94
- }
95
- export function redmineTaskIdFieldId(host) {
96
- const fieldId = host.customFields?.task_id;
97
- if (fieldId)
98
- return fieldId;
99
- throw new BackendError(redmineConfigMissingEnvMessage("AGENTPLANE_REDMINE_CUSTOM_FIELDS_TASK_ID"), "E_BACKEND");
100
- }
101
- export function setRedmineIssueCustomField(issue, fieldId, value) {
102
- setRedmineIssueCustomFieldValue(issue, fieldId, value);
103
- }
104
- export async function listRedmineRemoteTasks(host) {
105
- const taskFieldId = redmineTaskIdFieldId(host);
106
- return await listTasksRemoteImpl({
107
- projectId: host.projectId,
108
- taskFieldId,
109
- issueCache: host.issueCache,
110
- requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
111
- customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
112
- issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
113
- });
114
- }
115
- export async function findRedmineIssueByTaskId(host, taskId) {
116
- const taskFieldId = redmineTaskIdFieldId(host);
117
- return await findIssueByTaskIdImpl({
118
- taskId,
119
- projectId: host.projectId,
120
- taskFieldId,
121
- issueCache: host.issueCache,
122
- requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
123
- customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
124
- refreshList: async () => {
125
- await host.listTasksRemote();
126
- },
127
- });
128
- }
129
- export function redmineIssueToTask(host, issue, taskIdOverride) {
130
- return issueToTaskImpl({
131
- issue,
132
- taskIdOverride,
133
- reverseStatus: host.reverseStatus,
134
- customFields: host.customFields,
135
- ownerAgent: host.ownerAgent,
136
- defaultDocVersion: DOC_VERSION,
137
- });
138
- }
139
- export function redmineTaskToIssuePayload(host, task, existingIssue) {
140
- return taskToIssuePayloadImpl({
141
- task,
142
- existingIssue,
143
- statusMap: host.statusMap,
144
- assigneeId: host.assigneeId,
145
- customFields: host.customFields,
146
- appendCustomField: (fields, key, value) => appendRedmineBackendCustomField(host, fields, key, value),
147
- });
148
- }
149
- export function appendRedmineBackendCustomField(host, fields, key, value) {
150
- appendRedmineCustomField({ customFields: host.customFields, fields, key, value });
151
- }
152
- export function normalizeRedmineBackendComments(value) {
153
- return normalizeCommentsImpl(value);
154
- }
155
- export async function appendRedmineBackendCommentNotes(host, issueId, existingComments, desiredComments) {
156
- await appendCommentNotesImpl({
157
- issueId,
158
- existingComments,
159
- desiredComments,
160
- requestJson: async (method, reqPath, payload, params) => await requestRedmineBackendJson(host, method, reqPath, payload, params),
161
- });
162
- }
163
- export function redmineBackendCustomFieldValue(issue, fieldId) {
164
- return redmineCustomFieldValue(issue, fieldId);
165
- }
166
- export function maybeParseRedmineBackendJson(value) {
167
- return maybeParseRedmineJson(value);
168
- }
169
- export function coerceRedmineBackendDocVersion(value) {
170
- if (value === 2 || value === 3)
171
- return value;
172
- return null;
173
- }
174
- export async function requestRedmineBackendJson(host, method, reqPath, payload, params, opts) {
175
- return await requestRedmineJson({ baseUrl: host.baseUrl, apiKey: host.apiKey }, method, reqPath, payload, params, opts);
176
- }
177
- export const redmineBackendRuntimeMethods = {
178
- setInferredStatusByTaskStatus(next) {
179
- this.inferredStatusByTaskStatus = next;
180
- },
181
- ensureDocMetadata(task) {
182
- ensureRedmineDocMetadata(task);
183
- },
184
- async cacheTask(task, dirty) {
185
- await cacheRedmineTask(this, task, dirty);
186
- },
187
- assertExpectedRevisionSupported(taskId, opts) {
188
- assertRedmineExpectedRevisionSupported(this, taskId, opts);
189
- },
190
- assertExpectedRevision(taskId, expectedRevision, currentRevision) {
191
- assertRedmineExpectedRevision(taskId, expectedRevision, currentRevision);
192
- },
193
- taskIdFieldId() {
194
- return redmineTaskIdFieldId(this);
195
- },
196
- setIssueCustomFieldValue(issue, fieldId, value) {
197
- setRedmineIssueCustomField(issue, fieldId, value);
198
- },
199
- async listTasksRemote() {
200
- return await listRedmineRemoteTasks(this);
201
- },
202
- async findIssueByTaskId(taskId) {
203
- return await findRedmineIssueByTaskId(this, taskId);
204
- },
205
- issueToTask(issue, taskIdOverride) {
206
- return redmineIssueToTask(this, issue, taskIdOverride);
207
- },
208
- taskToIssuePayload(task, existingIssue) {
209
- return redmineTaskToIssuePayload(this, task, existingIssue);
210
- },
211
- appendCustomField(fields, key, value) {
212
- appendRedmineBackendCustomField(this, fields, key, value);
213
- },
214
- normalizeComments(value) {
215
- return normalizeRedmineBackendComments(value);
216
- },
217
- commentsToPairs(comments) {
218
- const pairs = [];
219
- for (const comment of comments) {
220
- const author = toStringSafe(comment.author).trim();
221
- const body = toStringSafe(comment.body).trim();
222
- if (!author && !body)
223
- continue;
224
- pairs.push([author, body]);
225
- }
226
- return pairs;
227
- },
228
- formatCommentNote(author = "unknown", body = "") {
229
- return `[comment] ${author}: ${body}`.trim();
230
- },
231
- async appendCommentNotes(issueId, existingComments, desiredComments) {
232
- await appendRedmineBackendCommentNotes(this, issueId, existingComments, desiredComments);
233
- },
234
- startDateFromTaskId(taskId) {
235
- return startDateFromTaskId(taskId);
236
- },
237
- doneRatioForStatus(status) {
238
- return doneRatioForStatus(status);
239
- },
240
- customFieldValue(issue, fieldId) {
241
- return redmineBackendCustomFieldValue(issue, fieldId);
242
- },
243
- maybeParseJson(value) {
244
- return maybeParseRedmineBackendJson(value);
245
- },
246
- coerceDocVersion(value) {
247
- return coerceRedmineBackendDocVersion(value);
248
- },
249
- diffTasks(localTask, remoteTask) {
250
- return diffRedmineTasks(localTask, remoteTask);
251
- },
252
- tasksDiffer(localTask, remoteTask) {
253
- return redmineTasksDiffer(localTask, remoteTask);
254
- },
255
- async requestJson(method, reqPath, payload, params, opts) {
256
- return await requestRedmineBackendJson(this, method, reqPath, payload, params, opts);
257
- },
258
- };
1
+ export { createRedmineCacheDocContext, createRedmineReportContext, createRedmineSyncContext, } from "./runtime-context.js";
2
+ export { redmineBackendRuntimeMethods } from "./runtime-methods.js";
3
+ export { appendRedmineBackendCommentNotes, appendRedmineBackendCustomField, diffRedmineBackendTasks, findRedmineIssueByTaskId, listRedmineRemoteTasks, maybeParseRedmineBackendJson, normalizeRedmineBackendComments, redmineBackendCustomFieldValue, redmineBackendTasksDiffer, redmineIssueToTask, redmineTaskToIssuePayload, requestRedmineBackendJson, } from "./runtime-operations.js";
4
+ export { assertRedmineExpectedRevision, assertRedmineExpectedRevisionSupported, cacheRedmineTask, coerceRedmineBackendDocVersion, ensureRedmineDocMetadata, redmineTaskIdFieldId, setRedmineIssueCustomField, } from "./runtime-state.js";
@@ -139,7 +139,7 @@ export function issueToTask(opts) {
139
139
  task.doc = derivedDoc;
140
140
  task.sections = canonicalSections ?? (derivedDoc ? taskDocToSectionMap(derivedDoc) : undefined);
141
141
  const docVersion = coerceDocVersion(docVersionVal);
142
- task.doc_version = docVersion ?? opts.defaultDocVersion;
142
+ task.doc_version = docVersion === opts.defaultDocVersion ? docVersion : opts.defaultDocVersion;
143
143
  task.doc_updated_at = docUpdatedAtVal ? toStringSafe(docUpdatedAtVal) : (updatedOn ?? nowIso());
144
144
  task.doc_updated_by = docUpdatedByVal ? toStringSafe(docUpdatedByVal) : opts.ownerAgent;
145
145
  return task;
@@ -0,0 +1,98 @@
1
+ import type { LocalBackend } from "../local-backend.js";
2
+ import type { TaskBackend, TaskData, TaskDocMeta, TaskWriteOptions } from "../shared.js";
3
+ import type { TaskComment } from "./comments.js";
4
+ export type RedmineBackendRuntimeHost = {
5
+ baseUrl: string;
6
+ apiKey: string;
7
+ projectId: string;
8
+ assigneeId: number | null;
9
+ ownerAgent: string;
10
+ statusMap: Record<string, unknown>;
11
+ customFields: Record<string, unknown>;
12
+ batchSize: number;
13
+ batchPauseMs: number;
14
+ cache: LocalBackend | null;
15
+ issueCache: Map<string, Record<string, unknown>>;
16
+ reverseStatus: Map<number, string>;
17
+ inferredStatusByTaskStatus: Map<string, number> | null;
18
+ capabilities: TaskBackend["capabilities"];
19
+ setInferredStatusByTaskStatus: (next: Map<string, number> | null) => void;
20
+ ensureDocMetadata: (task: TaskDocMeta) => void;
21
+ cacheTask: (task: TaskData, dirty: boolean) => Promise<void>;
22
+ assertExpectedRevisionSupported: (taskId: string, opts?: TaskWriteOptions) => void;
23
+ assertExpectedRevision: (taskId: string, expectedRevision: number | undefined, currentRevision: number) => void;
24
+ taskIdFieldId: () => unknown;
25
+ setIssueCustomFieldValue: (issue: Record<string, unknown>, fieldId: unknown, value: unknown) => void;
26
+ listTasksRemote: () => Promise<TaskData[]>;
27
+ findIssueByTaskId: (taskId: string) => Promise<Record<string, unknown> | null>;
28
+ issueToTask: (issue: Record<string, unknown>, taskIdOverride?: string) => TaskData | null;
29
+ taskToIssuePayload: (task: TaskData, existingIssue?: Record<string, unknown>) => Record<string, unknown>;
30
+ appendCustomField: (fields: Record<string, unknown>[], key: string, value: unknown) => void;
31
+ normalizeComments: (value: unknown) => TaskComment[];
32
+ appendCommentNotes: (issueId: string, existingComments: TaskComment[], desiredComments: TaskComment[]) => Promise<void>;
33
+ customFieldValue: (issue: Record<string, unknown>, fieldId: unknown) => string | null;
34
+ maybeParseJson: (value: unknown) => unknown;
35
+ requestJson: (method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>, opts?: {
36
+ attempts?: number;
37
+ backoff?: number;
38
+ }) => Promise<Record<string, unknown>>;
39
+ diffTasks: (localTask: TaskData, remoteTask: TaskData) => string;
40
+ tasksDiffer: (localTask: TaskData, remoteTask: TaskData) => boolean;
41
+ writeTask: (task: TaskData, opts?: TaskWriteOptions) => Promise<void>;
42
+ writeTasks: (tasks: TaskData[], opts?: TaskWriteOptions) => Promise<void>;
43
+ };
44
+ export declare function createRedmineCacheDocContext(host: RedmineBackendRuntimeHost): {
45
+ cache: LocalBackend | null;
46
+ customFields: Record<string, unknown>;
47
+ ownerAgent: string;
48
+ batchSize: number;
49
+ findIssueByTaskId: (taskId: string) => Promise<Record<string, unknown> | null>;
50
+ issueToTask: (issue: Record<string, unknown>, taskIdOverride?: string) => TaskData | null;
51
+ customFieldValue: (issue: Record<string, unknown>, fieldId: unknown) => string | null;
52
+ appendCustomField: (fields: Record<string, unknown>[], key: string, value: unknown) => void;
53
+ requestJson: (method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>) => Promise<Record<string, unknown>>;
54
+ assertExpectedRevisionSupported: (taskId: string, opts?: TaskWriteOptions) => void;
55
+ assertExpectedRevision: (taskId: string, expectedRevision: number | undefined, currentRevision: number) => void;
56
+ cacheTask: (task: TaskData, dirty: boolean) => Promise<void>;
57
+ };
58
+ export declare function createRedmineReportContext(host: RedmineBackendRuntimeHost): {
59
+ projectId: string;
60
+ customFields: Record<string, unknown>;
61
+ requestJson: (method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>) => Promise<Record<string, unknown>>;
62
+ };
63
+ export declare function createRedmineSyncContext(host: RedmineBackendRuntimeHost): {
64
+ cache: LocalBackend | null;
65
+ customFields: Record<string, unknown>;
66
+ ownerAgent: string;
67
+ projectId: string;
68
+ batchSize: number;
69
+ batchPauseMs: number;
70
+ statusMap: Record<string, unknown>;
71
+ issueCache: Map<string, Record<string, unknown>>;
72
+ inferredStatusByTaskStatus: Map<string, number> | null;
73
+ setInferredStatusByTaskStatus: (next: Map<string, number> | null) => void;
74
+ listTasksRemote: () => Promise<TaskData[]>;
75
+ writeTask: (task: TaskData, opts?: TaskWriteOptions) => Promise<void>;
76
+ writeTasks: (tasks: TaskData[], opts?: TaskWriteOptions) => Promise<void>;
77
+ findIssueByTaskId: (taskId: string) => Promise<Record<string, unknown> | null>;
78
+ issueToTask: (issue: Record<string, unknown>, taskIdOverride?: string) => TaskData | null;
79
+ taskToIssuePayload: (task: TaskData, existingIssue?: Record<string, unknown>) => Record<string, unknown>;
80
+ appendCustomField: (fields: Record<string, unknown>[], key: string, value: unknown) => void;
81
+ customFieldValue: (issue: Record<string, unknown>, fieldId: unknown) => string | null;
82
+ maybeParseJson: (value: unknown) => unknown;
83
+ normalizeComments: (value: unknown) => TaskComment[];
84
+ appendCommentNotes: (issueId: string, existingComments: TaskComment[], desiredComments: TaskComment[]) => Promise<void>;
85
+ cacheTask: (task: TaskData, dirty: boolean) => Promise<void>;
86
+ assertExpectedRevisionSupported: (taskId: string, opts?: TaskWriteOptions) => void;
87
+ assertExpectedRevision: (taskId: string, expectedRevision: number | undefined, currentRevision: number) => void;
88
+ ensureDocMetadata: (task: TaskDocMeta) => void;
89
+ diffTasks: (localTask: TaskData, remoteTask: TaskData) => string;
90
+ tasksDiffer: (localTask: TaskData, remoteTask: TaskData) => boolean;
91
+ taskIdFieldId: () => unknown;
92
+ setIssueCustomFieldValue: (issue: Record<string, unknown>, fieldId: unknown, value: unknown) => void;
93
+ requestJson: (method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>, opts?: {
94
+ attempts?: number;
95
+ backoff?: number;
96
+ }) => Promise<Record<string, unknown>>;
97
+ };
98
+ //# sourceMappingURL=runtime-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-context.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/redmine/runtime-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export function createRedmineCacheDocContext(host) {
2
+ return {
3
+ cache: host.cache,
4
+ customFields: host.customFields,
5
+ ownerAgent: host.ownerAgent,
6
+ batchSize: host.batchSize,
7
+ findIssueByTaskId: async (taskId) => await host.findIssueByTaskId(taskId),
8
+ issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
9
+ customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
10
+ appendCustomField: (fields, key, value) => host.appendCustomField(fields, key, value),
11
+ requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
12
+ assertExpectedRevisionSupported: (taskId, opts) => host.assertExpectedRevisionSupported(taskId, opts),
13
+ assertExpectedRevision: (taskId, expectedRevision, currentRevision) => host.assertExpectedRevision(taskId, expectedRevision, currentRevision),
14
+ cacheTask: async (task, dirty) => await host.cacheTask(task, dirty),
15
+ };
16
+ }
17
+ export function createRedmineReportContext(host) {
18
+ return {
19
+ projectId: host.projectId,
20
+ customFields: host.customFields,
21
+ requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
22
+ };
23
+ }
24
+ export function createRedmineSyncContext(host) {
25
+ return {
26
+ cache: host.cache,
27
+ customFields: host.customFields,
28
+ ownerAgent: host.ownerAgent,
29
+ projectId: host.projectId,
30
+ batchSize: host.batchSize,
31
+ batchPauseMs: host.batchPauseMs,
32
+ statusMap: host.statusMap,
33
+ issueCache: host.issueCache,
34
+ inferredStatusByTaskStatus: host.inferredStatusByTaskStatus,
35
+ setInferredStatusByTaskStatus: host.setInferredStatusByTaskStatus,
36
+ listTasksRemote: async () => await host.listTasksRemote(),
37
+ writeTask: async (task, opts) => await host.writeTask(task, opts),
38
+ writeTasks: async (tasks, opts) => await host.writeTasks(tasks, opts),
39
+ findIssueByTaskId: async (taskId) => await host.findIssueByTaskId(taskId),
40
+ issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
41
+ taskToIssuePayload: (task, existingIssue) => host.taskToIssuePayload(task, existingIssue),
42
+ appendCustomField: (fields, key, value) => host.appendCustomField(fields, key, value),
43
+ customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
44
+ maybeParseJson: (value) => host.maybeParseJson(value),
45
+ normalizeComments: (value) => host.normalizeComments(value),
46
+ appendCommentNotes: async (issueId, existingComments, desiredComments) => await host.appendCommentNotes(issueId, existingComments, desiredComments),
47
+ cacheTask: async (task, dirty) => await host.cacheTask(task, dirty),
48
+ assertExpectedRevisionSupported: (taskId, opts) => host.assertExpectedRevisionSupported(taskId, opts),
49
+ assertExpectedRevision: (taskId, expectedRevision, currentRevision) => host.assertExpectedRevision(taskId, expectedRevision, currentRevision),
50
+ ensureDocMetadata: (task) => host.ensureDocMetadata(task),
51
+ diffTasks: (localTask, remoteTask) => host.diffTasks(localTask, remoteTask),
52
+ tasksDiffer: (localTask, remoteTask) => host.tasksDiffer(localTask, remoteTask),
53
+ taskIdFieldId: () => host.taskIdFieldId(),
54
+ setIssueCustomFieldValue: (issue, fieldId, value) => host.setIssueCustomFieldValue(issue, fieldId, value),
55
+ requestJson: async (method, reqPath, payload, params, opts) => await host.requestJson(method, reqPath, payload, params, opts),
56
+ };
57
+ }
@@ -0,0 +1,33 @@
1
+ import { type TaskData, type TaskDocMeta, type TaskWriteOptions } from "../shared.js";
2
+ import type { TaskComment } from "./comments.js";
3
+ import type { RedmineBackendRuntimeHost } from "./runtime-context.js";
4
+ export declare const redmineBackendRuntimeMethods: {
5
+ setInferredStatusByTaskStatus(this: RedmineBackendRuntimeHost, next: Map<string, number> | null): void;
6
+ ensureDocMetadata(this: RedmineBackendRuntimeHost, task: TaskDocMeta): void;
7
+ cacheTask(this: RedmineBackendRuntimeHost, task: TaskData, dirty: boolean): Promise<void>;
8
+ assertExpectedRevisionSupported(this: RedmineBackendRuntimeHost, taskId: string, opts?: TaskWriteOptions): void;
9
+ assertExpectedRevision(this: RedmineBackendRuntimeHost, taskId: string, expectedRevision: number | undefined, currentRevision: number): void;
10
+ taskIdFieldId(this: RedmineBackendRuntimeHost): unknown;
11
+ setIssueCustomFieldValue(this: RedmineBackendRuntimeHost, issue: Record<string, unknown>, fieldId: unknown, value: unknown): void;
12
+ listTasksRemote(this: RedmineBackendRuntimeHost): Promise<TaskData[]>;
13
+ findIssueByTaskId(this: RedmineBackendRuntimeHost, taskId: string): Promise<Record<string, unknown> | null>;
14
+ issueToTask(this: RedmineBackendRuntimeHost, issue: Record<string, unknown>, taskIdOverride?: string): TaskData | null;
15
+ taskToIssuePayload(this: RedmineBackendRuntimeHost, task: TaskData, existingIssue?: Record<string, unknown>): Record<string, unknown>;
16
+ appendCustomField(this: RedmineBackendRuntimeHost, fields: Record<string, unknown>[], key: string, value: unknown): void;
17
+ normalizeComments(this: RedmineBackendRuntimeHost, value: unknown): TaskComment[];
18
+ commentsToPairs(this: RedmineBackendRuntimeHost, comments: TaskComment[]): [string, string][];
19
+ formatCommentNote(this: RedmineBackendRuntimeHost, author?: string, body?: string): string;
20
+ appendCommentNotes(this: RedmineBackendRuntimeHost, issueId: string, existingComments: TaskComment[], desiredComments: TaskComment[]): Promise<void>;
21
+ startDateFromTaskId(this: RedmineBackendRuntimeHost, taskId: string): string | null;
22
+ doneRatioForStatus(this: RedmineBackendRuntimeHost, status: string): number | null;
23
+ customFieldValue(this: RedmineBackendRuntimeHost, issue: Record<string, unknown>, fieldId: unknown): string | null;
24
+ maybeParseJson(this: RedmineBackendRuntimeHost, value: unknown): unknown;
25
+ coerceDocVersion(this: RedmineBackendRuntimeHost, value: unknown): 2 | 3 | null;
26
+ diffTasks(this: RedmineBackendRuntimeHost, localTask: TaskData, remoteTask: TaskData): string;
27
+ tasksDiffer(this: RedmineBackendRuntimeHost, localTask: TaskData, remoteTask: TaskData): boolean;
28
+ requestJson(this: RedmineBackendRuntimeHost, method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>, opts?: {
29
+ attempts?: number;
30
+ backoff?: number;
31
+ }): Promise<Record<string, unknown>>;
32
+ };
33
+ //# sourceMappingURL=runtime-methods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-methods.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/redmine/runtime-methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEpG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAwBjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,eAAO,MAAM,4BAA4B;wCAE/B,yBAAyB,QACzB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAC/B,IAAI;4BAIiB,yBAAyB,QAAQ,WAAW,GAAG,IAAI;oBAIrD,yBAAyB,QAAQ,QAAQ,SAAS,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;0CAKvF,yBAAyB,UACvB,MAAM,SACP,gBAAgB,GACtB,IAAI;iCAKC,yBAAyB,UACvB,MAAM,oBACI,MAAM,GAAG,SAAS,mBACnB,MAAM,GACtB,IAAI;wBAIa,yBAAyB,GAAG,OAAO;mCAK/C,yBAAyB,SACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WACrB,OAAO,SACT,OAAO,GACb,IAAI;0BAIqB,yBAAyB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;4BAKnE,yBAAyB,UACvB,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;sBAKlC,yBAAyB,SACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,mBACb,MAAM,GACtB,QAAQ,GAAG,IAAI;6BAKV,yBAAyB,QACzB,QAAQ,kBACE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;4BAKlB,yBAAyB,UACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAC5B,MAAM,SACJ,OAAO,GACb,IAAI;4BAIiB,yBAAyB,SAAS,OAAO,GAAG,WAAW,EAAE;0BAI3D,yBAAyB,YAAY,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;4BAWrE,yBAAyB,mCAAkC,MAAM;6BAKjF,yBAAyB,WACtB,MAAM,oBACG,WAAW,EAAE,mBACd,WAAW,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC;8BAIU,yBAAyB,UAAU,MAAM,GAAG,MAAM,GAAG,IAAI;6BAI1D,yBAAyB,UAAU,MAAM,GAAG,MAAM,GAAG,IAAI;2BAK1E,yBAAyB,SACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WACrB,OAAO,GACf,MAAM,GAAG,IAAI;yBAIK,yBAAyB,SAAS,OAAO,GAAG,OAAO;2BAIjD,yBAAyB,SAAS,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI;oBAI/D,yBAAyB,aAAa,QAAQ,cAAc,QAAQ,GAAG,MAAM;sBAI3E,yBAAyB,aAAa,QAAQ,cAAc,QAAQ,GAAG,OAAO;sBAKxF,yBAAyB,UACvB,MAAM,WACL,MAAM,YACL,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SACzB;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAGpC,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { toStringSafe } from "../shared.js";
2
+ import { doneRatioForStatus, startDateFromTaskId } from "./mapping.js";
3
+ import { appendRedmineBackendCommentNotes, appendRedmineBackendCustomField, diffRedmineBackendTasks, findRedmineIssueByTaskId, listRedmineRemoteTasks, maybeParseRedmineBackendJson, normalizeRedmineBackendComments, redmineBackendCustomFieldValue, redmineBackendTasksDiffer, redmineIssueToTask, redmineTaskToIssuePayload, requestRedmineBackendJson, } from "./runtime-operations.js";
4
+ import { assertRedmineExpectedRevision, assertRedmineExpectedRevisionSupported, cacheRedmineTask, coerceRedmineBackendDocVersion, ensureRedmineDocMetadata, redmineTaskIdFieldId, setRedmineIssueCustomField, } from "./runtime-state.js";
5
+ export const redmineBackendRuntimeMethods = {
6
+ setInferredStatusByTaskStatus(next) {
7
+ this.inferredStatusByTaskStatus = next;
8
+ },
9
+ ensureDocMetadata(task) {
10
+ ensureRedmineDocMetadata(task);
11
+ },
12
+ async cacheTask(task, dirty) {
13
+ await cacheRedmineTask(this, task, dirty);
14
+ },
15
+ assertExpectedRevisionSupported(taskId, opts) {
16
+ assertRedmineExpectedRevisionSupported(this, taskId, opts);
17
+ },
18
+ assertExpectedRevision(taskId, expectedRevision, currentRevision) {
19
+ assertRedmineExpectedRevision(taskId, expectedRevision, currentRevision);
20
+ },
21
+ taskIdFieldId() {
22
+ return redmineTaskIdFieldId(this);
23
+ },
24
+ setIssueCustomFieldValue(issue, fieldId, value) {
25
+ setRedmineIssueCustomField(issue, fieldId, value);
26
+ },
27
+ async listTasksRemote() {
28
+ return await listRedmineRemoteTasks(this);
29
+ },
30
+ async findIssueByTaskId(taskId) {
31
+ return await findRedmineIssueByTaskId(this, taskId);
32
+ },
33
+ issueToTask(issue, taskIdOverride) {
34
+ return redmineIssueToTask(this, issue, taskIdOverride);
35
+ },
36
+ taskToIssuePayload(task, existingIssue) {
37
+ return redmineTaskToIssuePayload(this, task, existingIssue);
38
+ },
39
+ appendCustomField(fields, key, value) {
40
+ appendRedmineBackendCustomField(this, fields, key, value);
41
+ },
42
+ normalizeComments(value) {
43
+ return normalizeRedmineBackendComments(value);
44
+ },
45
+ commentsToPairs(comments) {
46
+ const pairs = [];
47
+ for (const comment of comments) {
48
+ const author = toStringSafe(comment.author).trim();
49
+ const body = toStringSafe(comment.body).trim();
50
+ if (!author && !body)
51
+ continue;
52
+ pairs.push([author, body]);
53
+ }
54
+ return pairs;
55
+ },
56
+ formatCommentNote(author = "unknown", body = "") {
57
+ return `[comment] ${author}: ${body}`.trim();
58
+ },
59
+ async appendCommentNotes(issueId, existingComments, desiredComments) {
60
+ await appendRedmineBackendCommentNotes(this, issueId, existingComments, desiredComments);
61
+ },
62
+ startDateFromTaskId(taskId) {
63
+ return startDateFromTaskId(taskId);
64
+ },
65
+ doneRatioForStatus(status) {
66
+ return doneRatioForStatus(status);
67
+ },
68
+ customFieldValue(issue, fieldId) {
69
+ return redmineBackendCustomFieldValue(issue, fieldId);
70
+ },
71
+ maybeParseJson(value) {
72
+ return maybeParseRedmineBackendJson(value);
73
+ },
74
+ coerceDocVersion(value) {
75
+ return coerceRedmineBackendDocVersion(value);
76
+ },
77
+ diffTasks(localTask, remoteTask) {
78
+ return diffRedmineBackendTasks(localTask, remoteTask);
79
+ },
80
+ tasksDiffer(localTask, remoteTask) {
81
+ return redmineBackendTasksDiffer(localTask, remoteTask);
82
+ },
83
+ async requestJson(method, reqPath, payload, params, opts) {
84
+ return await requestRedmineBackendJson(this, method, reqPath, payload, params, opts);
85
+ },
86
+ };
@@ -0,0 +1,19 @@
1
+ import { type TaskData } from "../shared.js";
2
+ import { type TaskComment } from "./comments.js";
3
+ import type { RedmineBackendRuntimeHost } from "./runtime-context.js";
4
+ export declare function listRedmineRemoteTasks(host: RedmineBackendRuntimeHost): Promise<TaskData[]>;
5
+ export declare function findRedmineIssueByTaskId(host: RedmineBackendRuntimeHost, taskId: string): Promise<Record<string, unknown> | null>;
6
+ export declare function redmineIssueToTask(host: RedmineBackendRuntimeHost, issue: Record<string, unknown>, taskIdOverride?: string): TaskData | null;
7
+ export declare function redmineTaskToIssuePayload(host: RedmineBackendRuntimeHost, task: TaskData, existingIssue?: Record<string, unknown>): Record<string, unknown>;
8
+ export declare function appendRedmineBackendCustomField(host: RedmineBackendRuntimeHost, fields: Record<string, unknown>[], key: string, value: unknown): void;
9
+ export declare function normalizeRedmineBackendComments(value: unknown): TaskComment[];
10
+ export declare function appendRedmineBackendCommentNotes(host: RedmineBackendRuntimeHost, issueId: string, existingComments: TaskComment[], desiredComments: TaskComment[]): Promise<void>;
11
+ export declare function redmineBackendCustomFieldValue(issue: Record<string, unknown>, fieldId: unknown): string | null;
12
+ export declare function maybeParseRedmineBackendJson(value: unknown): unknown;
13
+ export declare function diffRedmineBackendTasks(localTask: TaskData, remoteTask: TaskData): string;
14
+ export declare function redmineBackendTasksDiffer(localTask: TaskData, remoteTask: TaskData): boolean;
15
+ export declare function requestRedmineBackendJson(host: RedmineBackendRuntimeHost, method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>, opts?: {
16
+ attempts?: number;
17
+ backoff?: number;
18
+ }): Promise<Record<string, unknown>>;
19
+ //# sourceMappingURL=runtime-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-operations.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/redmine/runtime-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AAgBvB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAGtE,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAWjG;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAczC;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,yBAAyB,EAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,cAAc,CAAC,EAAE,MAAM,GACtB,QAAQ,GAAG,IAAI,CASjB;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,yBAAyB,EAC/B,IAAI,EAAE,QAAQ,EACd,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACjC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,GACb,IAAI,CAEN;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,EAAE,CAE7E;AAED,wBAAsB,gCAAgC,CACpD,IAAI,EAAE,yBAAyB,EAC/B,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,WAAW,EAAE,EAC/B,eAAe,EAAE,WAAW,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,OAAO,GACf,MAAM,GAAG,IAAI,CAEf;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEpE;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,GAAG,MAAM,CAEzF;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,GAAG,OAAO,CAE5F;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CASlC"}