@open-agent-toolkit/cli 0.2.65 → 0.2.66

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 (142) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/configuration.md +19 -1
  3. package/assets/docs/cli-utilities/index.md +3 -0
  4. package/assets/docs/cli-utilities/remote-project-management.md +191 -0
  5. package/assets/docs/reference/cli-reference.md +12 -1
  6. package/assets/docs/reference/file-locations.md +22 -0
  7. package/assets/docs/reference/oat-directory-structure.md +30 -17
  8. package/assets/docs/reference/troubleshooting.md +44 -0
  9. package/assets/docs/workflows/skills/index.md +33 -0
  10. package/assets/public-package-versions.json +4 -4
  11. package/assets/skills/oat-doctor/SKILL.md +4 -4
  12. package/assets/skills/oat-pjm-remote/SKILL.md +101 -0
  13. package/assets/skills/oat-pjm-remote/references/external-action-protocol.md +43 -0
  14. package/dist/commands/backlog/new.d.ts +1 -0
  15. package/dist/commands/backlog/new.d.ts.map +1 -1
  16. package/dist/commands/backlog/new.js +3 -1
  17. package/dist/commands/config/index.d.ts +1 -0
  18. package/dist/commands/config/index.d.ts.map +1 -1
  19. package/dist/commands/config/index.js +232 -1
  20. package/dist/commands/pjm/doctor.d.ts +2 -0
  21. package/dist/commands/pjm/doctor.d.ts.map +1 -1
  22. package/dist/commands/pjm/doctor.js +71 -1
  23. package/dist/commands/pjm/index.d.ts +2 -0
  24. package/dist/commands/pjm/index.d.ts.map +1 -1
  25. package/dist/commands/pjm/index.js +3 -0
  26. package/dist/commands/pjm/remote/__integration__/lifecycle-harness.d.ts +60 -0
  27. package/dist/commands/pjm/remote/__integration__/lifecycle-harness.d.ts.map +1 -0
  28. package/dist/commands/pjm/remote/__integration__/lifecycle-harness.js +151 -0
  29. package/dist/commands/pjm/remote/association.d.ts +27 -0
  30. package/dist/commands/pjm/remote/association.d.ts.map +1 -0
  31. package/dist/commands/pjm/remote/association.js +68 -0
  32. package/dist/commands/pjm/remote/authority.d.ts +210 -0
  33. package/dist/commands/pjm/remote/authority.d.ts.map +1 -0
  34. package/dist/commands/pjm/remote/authority.js +341 -0
  35. package/dist/commands/pjm/remote/batch.d.ts +15 -0
  36. package/dist/commands/pjm/remote/batch.d.ts.map +1 -0
  37. package/dist/commands/pjm/remote/batch.js +126 -0
  38. package/dist/commands/pjm/remote/closeout.d.ts +69 -0
  39. package/dist/commands/pjm/remote/closeout.d.ts.map +1 -0
  40. package/dist/commands/pjm/remote/closeout.js +208 -0
  41. package/dist/commands/pjm/remote/create-binding.d.ts +62 -0
  42. package/dist/commands/pjm/remote/create-binding.d.ts.map +1 -0
  43. package/dist/commands/pjm/remote/create-binding.js +126 -0
  44. package/dist/commands/pjm/remote/credential-safety.d.ts +7 -0
  45. package/dist/commands/pjm/remote/credential-safety.d.ts.map +1 -0
  46. package/dist/commands/pjm/remote/credential-safety.js +21 -0
  47. package/dist/commands/pjm/remote/discussion.d.ts +49 -0
  48. package/dist/commands/pjm/remote/discussion.d.ts.map +1 -0
  49. package/dist/commands/pjm/remote/discussion.js +124 -0
  50. package/dist/commands/pjm/remote/doctor.d.ts +22 -0
  51. package/dist/commands/pjm/remote/doctor.d.ts.map +1 -0
  52. package/dist/commands/pjm/remote/doctor.js +380 -0
  53. package/dist/commands/pjm/remote/external-action.d.ts +208 -0
  54. package/dist/commands/pjm/remote/external-action.d.ts.map +1 -0
  55. package/dist/commands/pjm/remote/external-action.js +367 -0
  56. package/dist/commands/pjm/remote/host-execution.d.ts +28 -0
  57. package/dist/commands/pjm/remote/host-execution.d.ts.map +1 -0
  58. package/dist/commands/pjm/remote/host-execution.js +63 -0
  59. package/dist/commands/pjm/remote/index.d.ts +41 -0
  60. package/dist/commands/pjm/remote/index.d.ts.map +1 -0
  61. package/dist/commands/pjm/remote/index.js +280 -0
  62. package/dist/commands/pjm/remote/jira-adf.d.ts +35 -0
  63. package/dist/commands/pjm/remote/jira-adf.d.ts.map +1 -0
  64. package/dist/commands/pjm/remote/jira-adf.js +169 -0
  65. package/dist/commands/pjm/remote/lifecycle.d.ts +163 -0
  66. package/dist/commands/pjm/remote/lifecycle.d.ts.map +1 -0
  67. package/dist/commands/pjm/remote/lifecycle.js +224 -0
  68. package/dist/commands/pjm/remote/local-projection.d.ts +30 -0
  69. package/dist/commands/pjm/remote/local-projection.d.ts.map +1 -0
  70. package/dist/commands/pjm/remote/local-projection.js +95 -0
  71. package/dist/commands/pjm/remote/managed-markdown.d.ts +30 -0
  72. package/dist/commands/pjm/remote/managed-markdown.d.ts.map +1 -0
  73. package/dist/commands/pjm/remote/managed-markdown.js +128 -0
  74. package/dist/commands/pjm/remote/migrate.d.ts +14 -0
  75. package/dist/commands/pjm/remote/migrate.d.ts.map +1 -0
  76. package/dist/commands/pjm/remote/migrate.js +32 -0
  77. package/dist/commands/pjm/remote/operation-state.d.ts +15 -0
  78. package/dist/commands/pjm/remote/operation-state.d.ts.map +1 -0
  79. package/dist/commands/pjm/remote/operation-state.js +143 -0
  80. package/dist/commands/pjm/remote/outbound-projection-safety.d.ts +25 -0
  81. package/dist/commands/pjm/remote/outbound-projection-safety.d.ts.map +1 -0
  82. package/dist/commands/pjm/remote/outbound-projection-safety.js +99 -0
  83. package/dist/commands/pjm/remote/output.d.ts +60 -0
  84. package/dist/commands/pjm/remote/output.d.ts.map +1 -0
  85. package/dist/commands/pjm/remote/output.js +48 -0
  86. package/dist/commands/pjm/remote/preview.d.ts +88 -0
  87. package/dist/commands/pjm/remote/preview.d.ts.map +1 -0
  88. package/dist/commands/pjm/remote/preview.js +154 -0
  89. package/dist/commands/pjm/remote/provider-conformance.d.ts +13 -0
  90. package/dist/commands/pjm/remote/provider-conformance.d.ts.map +1 -0
  91. package/dist/commands/pjm/remote/provider-conformance.js +37 -0
  92. package/dist/commands/pjm/remote/provider.d.ts +57 -0
  93. package/dist/commands/pjm/remote/provider.d.ts.map +1 -0
  94. package/dist/commands/pjm/remote/provider.js +28 -0
  95. package/dist/commands/pjm/remote/providers/github-publication-safety.d.ts +46 -0
  96. package/dist/commands/pjm/remote/providers/github-publication-safety.d.ts.map +1 -0
  97. package/dist/commands/pjm/remote/providers/github-publication-safety.js +126 -0
  98. package/dist/commands/pjm/remote/providers/github.d.ts +207 -0
  99. package/dist/commands/pjm/remote/providers/github.d.ts.map +1 -0
  100. package/dist/commands/pjm/remote/providers/github.js +1456 -0
  101. package/dist/commands/pjm/remote/providers/jira.d.ts +245 -0
  102. package/dist/commands/pjm/remote/providers/jira.d.ts.map +1 -0
  103. package/dist/commands/pjm/remote/providers/jira.js +1650 -0
  104. package/dist/commands/pjm/remote/providers/linear.d.ts +182 -0
  105. package/dist/commands/pjm/remote/providers/linear.d.ts.map +1 -0
  106. package/dist/commands/pjm/remote/providers/linear.js +1289 -0
  107. package/dist/commands/pjm/remote/purpose-policy.d.ts +29 -0
  108. package/dist/commands/pjm/remote/purpose-policy.d.ts.map +1 -0
  109. package/dist/commands/pjm/remote/purpose-policy.js +118 -0
  110. package/dist/commands/pjm/remote/reconcile.d.ts +42 -0
  111. package/dist/commands/pjm/remote/reconcile.d.ts.map +1 -0
  112. package/dist/commands/pjm/remote/reconcile.js +101 -0
  113. package/dist/commands/pjm/remote/resolution.d.ts +122 -0
  114. package/dist/commands/pjm/remote/resolution.d.ts.map +1 -0
  115. package/dist/commands/pjm/remote/resolution.js +243 -0
  116. package/dist/commands/pjm/remote/schema.d.ts +9309 -0
  117. package/dist/commands/pjm/remote/schema.d.ts.map +1 -0
  118. package/dist/commands/pjm/remote/schema.js +1503 -0
  119. package/dist/commands/pjm/remote/service.d.ts +20 -0
  120. package/dist/commands/pjm/remote/service.d.ts.map +1 -0
  121. package/dist/commands/pjm/remote/service.js +5121 -0
  122. package/dist/commands/pjm/remote/shared-storage.d.ts +36 -0
  123. package/dist/commands/pjm/remote/shared-storage.d.ts.map +1 -0
  124. package/dist/commands/pjm/remote/shared-storage.js +110 -0
  125. package/dist/commands/pjm/remote/snapshot.d.ts +32 -0
  126. package/dist/commands/pjm/remote/snapshot.d.ts.map +1 -0
  127. package/dist/commands/pjm/remote/snapshot.js +140 -0
  128. package/dist/commands/pjm/remote/storage-locator.d.ts +29 -0
  129. package/dist/commands/pjm/remote/storage-locator.d.ts.map +1 -0
  130. package/dist/commands/pjm/remote/storage-locator.js +62 -0
  131. package/dist/commands/pjm/remote/store.d.ts +85 -0
  132. package/dist/commands/pjm/remote/store.d.ts.map +1 -0
  133. package/dist/commands/pjm/remote/store.js +553 -0
  134. package/dist/commands/pjm/remote/verification.d.ts +40 -0
  135. package/dist/commands/pjm/remote/verification.d.ts.map +1 -0
  136. package/dist/commands/pjm/remote/verification.js +100 -0
  137. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  138. package/dist/commands/tools/shared/pack-manifest.js +1 -0
  139. package/dist/config/oat-config.d.ts +26 -0
  140. package/dist/config/oat-config.d.ts.map +1 -1
  141. package/dist/config/oat-config.js +186 -2
  142. package/package.json +2 -2
@@ -0,0 +1,280 @@
1
+ import { resolve } from 'node:path';
2
+ import { buildCommandContext } from '../../../app/command-context.js';
3
+ import { readGlobalOptions } from '../../shared/shared.utils.js';
4
+ import { resolveProjectRoot } from '../../../fs/paths.js';
5
+ import { Command } from 'commander';
6
+ import { resolvePjmAdoption } from '../adoption.js';
7
+ import { renderRemoteCommand } from './output.js';
8
+ import { createProductionRemoteRunner } from './service.js';
9
+ const DEFAULT_DEPENDENCIES = {
10
+ resolveProjectRoot,
11
+ async checkAdoption(projectRoot) {
12
+ const adoption = await resolvePjmAdoption({
13
+ projectRoot,
14
+ repoRoot: resolve(projectRoot, '.oat', 'repo'),
15
+ });
16
+ return adoption.state === 'declared' || adoption.state === 'inferred-legacy'
17
+ ? 'complete'
18
+ : adoption.state === 'partial-initialization'
19
+ ? 'partial'
20
+ : 'absent';
21
+ },
22
+ run: createProductionRemoteRunner(),
23
+ };
24
+ export function createPjmRemoteCommand(overrides = {}) {
25
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
26
+ const remote = new Command('remote').description('Manage explicit provider-neutral remote project lifecycle operations');
27
+ remote
28
+ .command('intake <provider-ref>')
29
+ .description('Intake a remote issue into a local backlog target')
30
+ .requiredOption('--to-backlog <id>', 'Local backlog item ID')
31
+ .option('--capability-evidence-stdin', 'Read one sanitized live capability evidence object from stdin')
32
+ .action(async (providerRef, options, command) => {
33
+ await execute({
34
+ operation: 'intake',
35
+ providerRef,
36
+ backlogId: options.toBacklog,
37
+ capabilityEvidenceStdin: options.capabilityEvidenceStdin,
38
+ }, command, dependencies);
39
+ });
40
+ addBindingCommand(remote, 'publish', 'Publish one selected remote binding', dependencies);
41
+ remote
42
+ .command('closeout')
43
+ .description('Review and close out every eligible binding for one project')
44
+ .requiredOption('--project <path>', 'Local OAT project path')
45
+ .option('--apply-preview <batch-id>', 'Apply one approved composite substep')
46
+ .option('--capability-evidence-stdin', 'Read current host capability evidence')
47
+ .option('--authority-evidence-file <path>', 'Read bounded caller authority evidence')
48
+ .action(async (options, command) => {
49
+ await execute({
50
+ operation: 'closeout',
51
+ projectPath: options.project,
52
+ previewOperationId: options.applyPreview,
53
+ capabilityEvidenceStdin: options.capabilityEvidenceStdin,
54
+ authorityEvidenceFile: options.authorityEvidenceFile,
55
+ }, command, dependencies);
56
+ });
57
+ remote
58
+ .command('discussion')
59
+ .description('Read bounded remote discussion as non-persisted evidence')
60
+ .requiredOption('--binding <id>', 'Remote binding ID')
61
+ .requiredOption('--limit <count>', 'Maximum evidence items', parseCount)
62
+ .option('--capability-evidence-stdin', 'Read one sanitized live capability evidence object from stdin')
63
+ .action(async (options, command) => {
64
+ await execute({
65
+ operation: 'discussion',
66
+ bindingId: options.binding,
67
+ discussionLimit: options.limit,
68
+ capabilityEvidenceStdin: options.capabilityEvidenceStdin,
69
+ }, command, dependencies);
70
+ });
71
+ const resolveCommand = remote
72
+ .command('resolve')
73
+ .description('Resolve a remote binding anomaly with fresh approval');
74
+ resolveCommand
75
+ .command('relink <provider-ref>')
76
+ .requiredOption('--binding <id>', 'Remote binding ID')
77
+ .option('--apply-preview <operation-id>', 'Apply an exact approved preview')
78
+ .option('--capability-evidence-stdin', 'Read current host capability evidence')
79
+ .option('--authority-evidence-file <path>', 'Read bounded caller authority evidence')
80
+ .action(async (providerRef, options, command) => {
81
+ await execute({
82
+ operation: 'resolve',
83
+ resolutionKind: 'relink',
84
+ bindingId: options.binding,
85
+ providerRef,
86
+ previewOperationId: options.applyPreview,
87
+ capabilityEvidenceStdin: options.capabilityEvidenceStdin,
88
+ authorityEvidenceFile: options.authorityEvidenceFile,
89
+ }, command, dependencies);
90
+ });
91
+ remote
92
+ .command('doctor')
93
+ .description('Diagnose local remote-binding state without provider contact')
94
+ .option('--capability-evidence-stdin', 'Read one sanitized current host capability evidence object from stdin')
95
+ .action(async (options, command) => {
96
+ await execute({
97
+ operation: 'doctor',
98
+ capabilityEvidenceStdin: options.capabilityEvidenceStdin,
99
+ }, command, dependencies);
100
+ });
101
+ remote
102
+ .command('migrate')
103
+ .description('Check or apply an approved local-only remote migration')
104
+ .option('--check', 'Preview local migration candidates')
105
+ .option('--apply', 'Apply an exact approved local migration')
106
+ .option('--approval-digest <digest>', 'Approved check preview digest')
107
+ .action(async (options, command) => {
108
+ if (Boolean(options.check) === Boolean(options.apply)) {
109
+ throw new Error('Remote migrate requires exactly one of --check or --apply.');
110
+ }
111
+ await execute({
112
+ operation: 'migrate',
113
+ migrationMode: options.apply ? 'apply' : 'check',
114
+ migrationApprovalDigest: options.approvalDigest,
115
+ }, command, dependencies);
116
+ });
117
+ resolveCommand
118
+ .command('detach')
119
+ .requiredOption('--binding <id>', 'Remote binding ID')
120
+ .option('--apply-preview <operation-id>', 'Apply an exact approved preview')
121
+ .option('--authority-evidence-file <path>', 'Read bounded caller authority evidence')
122
+ .action(async (options, command) => {
123
+ await execute({
124
+ operation: 'resolve',
125
+ resolutionKind: 'detach',
126
+ bindingId: options.binding,
127
+ previewOperationId: options.applyPreview,
128
+ authorityEvidenceFile: options.authorityEvidenceFile,
129
+ }, command, dependencies);
130
+ });
131
+ resolveCommand
132
+ .command('recreate')
133
+ .requiredOption('--binding <id>', 'Remote binding ID')
134
+ .option('--apply-preview <operation-id>', 'Apply an exact approved preview')
135
+ .option('--capability-evidence-stdin', 'Read current host capability evidence')
136
+ .option('--authority-evidence-file <path>', 'Read bounded caller authority evidence')
137
+ .action(async (options, command) => {
138
+ await execute({
139
+ operation: 'resolve',
140
+ resolutionKind: 'recreate',
141
+ bindingId: options.binding,
142
+ previewOperationId: options.applyPreview,
143
+ capabilityEvidenceStdin: options.capabilityEvidenceStdin,
144
+ authorityEvidenceFile: options.authorityEvidenceFile,
145
+ }, command, dependencies);
146
+ });
147
+ addBindingCommand(remote, 'refresh', 'Refresh one remote binding without mutation', dependencies);
148
+ addBindingCommand(remote, 'reconcile', 'Reconcile one remote binding', dependencies);
149
+ remote
150
+ .command('storage')
151
+ .description('Preview or apply shared operational storage')
152
+ .command('shared')
153
+ .requiredOption('--repository-fingerprint <digest>')
154
+ .requiredOption('--config-target <path>')
155
+ .requiredOption('--current-mode <mode>')
156
+ .requiredOption('--proposed-path <paths...>')
157
+ .option('--apply')
158
+ .option('--approval-digest <digest>')
159
+ .action(async (options, command) => {
160
+ if (options.apply && !options.approvalDigest) {
161
+ throw new Error('Applying shared storage requires preview approval evidence.');
162
+ }
163
+ await execute({
164
+ operation: 'storage-transition',
165
+ storage: {
166
+ repositoryFingerprint: options.repositoryFingerprint,
167
+ configTarget: options.configTarget,
168
+ currentMode: options.currentMode,
169
+ proposedPaths: options.proposedPath,
170
+ apply: options.apply ?? false,
171
+ },
172
+ storageApprovalDigest: options.approvalDigest,
173
+ }, command, dependencies);
174
+ });
175
+ remote
176
+ .command('operation')
177
+ .description('Continue a durable remote operation')
178
+ .command('continue')
179
+ .requiredOption('--operation <id>', 'Operation ID')
180
+ .option('--observation-stdin', 'Read one sanitized observation from stdin; omit only to resume a durable create-action handoff')
181
+ .option('--authority-evidence-file <path>', 'Re-read one bounded caller-owned mutation authority record')
182
+ .action(async (options, command) => {
183
+ await execute({
184
+ operation: 'operation-continue',
185
+ operationId: options.operation,
186
+ observationStdin: Boolean(options.observationStdin),
187
+ authorityEvidenceFile: options.authorityEvidenceFile,
188
+ }, command, dependencies);
189
+ });
190
+ return remote;
191
+ }
192
+ function parseCount(value) {
193
+ const parsed = Number(value);
194
+ if (!Number.isSafeInteger(parsed) || parsed < 1 || parsed > 100) {
195
+ throw new Error('Expected an integer from 1 to 100.');
196
+ }
197
+ return parsed;
198
+ }
199
+ function addBindingCommand(parent, name, description, dependencies) {
200
+ const command = parent.command(name).description(description);
201
+ if (name === 'publish') {
202
+ command
203
+ .option('--binding <id>', 'Existing remote binding ID')
204
+ .option('--provider <provider>', 'Provider for a new remote issue')
205
+ .option('--to-backlog <id>', 'Local backlog item to publish')
206
+ .option('--to-project <path-or-id>', 'Local project path or unambiguous project ID to publish')
207
+ .option('--project-publication-file <path>', 'Explicit normalized project publication JSON');
208
+ }
209
+ else {
210
+ command.requiredOption('--binding <id>', 'Remote binding ID');
211
+ }
212
+ command.option('--capability-evidence-stdin', 'Read one sanitized live capability evidence object from stdin');
213
+ if (name !== 'refresh') {
214
+ command.option('--authority-evidence-file <path>', 'Read one bounded caller-owned mutation authority record');
215
+ command.option('--apply-preview <operation-id>', 'Apply one exact persisted user-approved preview');
216
+ }
217
+ command.action(async (options, commander) => {
218
+ const createTargets = [options.toBacklog, options.toProject].filter(Boolean);
219
+ if (name === 'publish') {
220
+ const usesBinding = Boolean(options.binding);
221
+ const usesCreateTarget = createTargets.length > 0;
222
+ if (usesBinding === usesCreateTarget || createTargets.length > 1) {
223
+ throw new Error('Publish requires exactly one existing binding or one local create target.');
224
+ }
225
+ if (usesCreateTarget && !options.provider) {
226
+ throw new Error('Publishing an unbound target requires a provider.');
227
+ }
228
+ if (usesBinding && options.provider) {
229
+ throw new Error('Provider is only valid for an unbound publish target.');
230
+ }
231
+ if (options.toProject && !options.projectPublicationFile) {
232
+ throw new Error('Publishing a project requires --project-publication-file.');
233
+ }
234
+ if (!options.toProject && options.projectPublicationFile) {
235
+ throw new Error('--project-publication-file is only valid with --to-project.');
236
+ }
237
+ }
238
+ const request = {
239
+ operation: name,
240
+ bindingId: options.binding,
241
+ capabilityEvidenceStdin: Boolean(options.capabilityEvidenceStdin),
242
+ authorityEvidenceFile: options.authorityEvidenceFile,
243
+ previewOperationId: options.applyPreview,
244
+ };
245
+ if (options.toBacklog || options.toProject) {
246
+ request.createTarget = {
247
+ provider: options.provider,
248
+ localKind: options.toBacklog ? 'backlog' : 'project',
249
+ localId: (options.toBacklog ?? options.toProject),
250
+ publicationFile: options.projectPublicationFile,
251
+ };
252
+ }
253
+ await execute(request, commander, dependencies);
254
+ });
255
+ }
256
+ async function execute(request, command, dependencies) {
257
+ const context = buildCommandContext(readGlobalOptions(command));
258
+ try {
259
+ const projectRoot = await dependencies.resolveProjectRoot(context.cwd);
260
+ const adoption = await dependencies.checkAdoption(projectRoot);
261
+ if (adoption !== 'complete') {
262
+ throw new Error(`PJM adoption is ${adoption}; run oat pjm init before remote operations.`);
263
+ }
264
+ const envelope = await dependencies.run({ ...request, projectRoot });
265
+ const rendered = renderRemoteCommand(envelope, { json: context.json });
266
+ if (rendered.stdout)
267
+ process.stdout.write(rendered.stdout);
268
+ if (rendered.stderr)
269
+ process.stderr.write(rendered.stderr);
270
+ process.exitCode = rendered.exitCode;
271
+ }
272
+ catch (error) {
273
+ const message = error instanceof Error ? error.message : String(error);
274
+ if (context.json)
275
+ context.logger.json({ status: 'failed', message });
276
+ else
277
+ context.logger.error(message);
278
+ process.exitCode = 2;
279
+ }
280
+ }
@@ -0,0 +1,35 @@
1
+ export type JiraAdfValue = null | boolean | number | string | JiraAdfValue[] | {
2
+ [key: string]: JiraAdfValue;
3
+ };
4
+ export interface JiraAdfDocument {
5
+ type: 'doc';
6
+ version: 1;
7
+ content: JiraAdfNode[];
8
+ }
9
+ export interface JiraAdfNode {
10
+ type: string;
11
+ attrs?: Record<string, JiraAdfValue>;
12
+ content?: JiraAdfNode[];
13
+ text?: string;
14
+ marks?: Array<Record<string, JiraAdfValue>>;
15
+ }
16
+ export interface JiraAdfInspection {
17
+ state: 'absent' | 'managed';
18
+ bindingId: string;
19
+ managedText: string | null;
20
+ documentDigest: string;
21
+ surroundingDigest: string;
22
+ }
23
+ export declare const JIRA_ADF_LIMITS: {
24
+ readonly maxDocumentBytes: 1048576;
25
+ readonly maxManagedTextBytes: 65536;
26
+ readonly maxBindingIdBytes: 128;
27
+ readonly maxDepth: 64;
28
+ readonly maxNodes: 10000;
29
+ };
30
+ export declare function inspectJiraAdf(document: JiraAdfDocument, bindingId: string): JiraAdfInspection;
31
+ export declare function validateJiraAdfDocument(document: unknown): asserts document is JiraAdfDocument;
32
+ export declare function insertJiraAdfManagedContent(document: JiraAdfDocument, bindingId: string, content: string): JiraAdfDocument;
33
+ export declare function replaceJiraAdfManagedContent(document: JiraAdfDocument, bindingId: string, content: string): JiraAdfDocument;
34
+ export declare function verifyJiraAdfReplacement(before: JiraAdfDocument, after: JiraAdfDocument, bindingId: string, expectedContent: string): boolean;
35
+ //# sourceMappingURL=jira-adf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-adf.d.ts","sourceRoot":"","sources":["../../../../src/commands/pjm/remote/jira-adf.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GACpB,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,YAAY,EAAE,GACd;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,eAAe;aAC1B,gBAAgB,EAAE,OAAS;aAC3B,mBAAmB,EAAE,KAAM;aAC3B,iBAAiB,EAAE,GAAG;aACtB,QAAQ,EAAE,EAAE;aACZ,QAAQ,EAAE,KAAM;CACR,CAAC;AAIX,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,MAAM,GAChB,iBAAiB,CAmBnB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,QAAQ,IAAI,eAAe,CAErC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,eAAe,CASjB;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,eAAe,CAUjB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,OAAO,CAWT"}
@@ -0,0 +1,169 @@
1
+ import { semanticDigest } from '../../pjm/remote/provider.js';
2
+ export const JIRA_ADF_LIMITS = {
3
+ maxDocumentBytes: 1_048_576,
4
+ maxManagedTextBytes: 65_536,
5
+ maxBindingIdBytes: 128,
6
+ maxDepth: 64,
7
+ maxNodes: 10_000,
8
+ };
9
+ const MARKER_PREFIX = 'oat-managed:';
10
+ export function inspectJiraAdf(document, bindingId) {
11
+ assertDocument(document);
12
+ assertBindingId(bindingId);
13
+ const matches = managedIndexes(document, bindingId);
14
+ if (matches.malformed)
15
+ throw new Error('Jira ADF managed anchor is malformed.');
16
+ if (matches.indexes.length > 1)
17
+ throw new Error('Jira ADF managed anchor is duplicated.');
18
+ const index = matches.indexes[0];
19
+ return {
20
+ state: index === undefined ? 'absent' : 'managed',
21
+ bindingId,
22
+ managedText: index === undefined ? null : extractManagedText(document.content[index]),
23
+ documentDigest: semanticDigest(document),
24
+ surroundingDigest: semanticDigest(document.content.filter((_, candidate) => candidate !== index)),
25
+ };
26
+ }
27
+ export function validateJiraAdfDocument(document) {
28
+ assertDocument(document);
29
+ }
30
+ export function insertJiraAdfManagedContent(document, bindingId, content) {
31
+ const inspection = inspectJiraAdf(document, bindingId);
32
+ if (inspection.state !== 'absent')
33
+ throw new Error('Jira ADF managed anchor already exists.');
34
+ const next = cloneDocument(document);
35
+ next.content.push(managedNode(bindingId, content));
36
+ assertDocument(next);
37
+ assertSurroundingPreserved(document, next, bindingId);
38
+ return next;
39
+ }
40
+ export function replaceJiraAdfManagedContent(document, bindingId, content) {
41
+ const inspection = inspectJiraAdf(document, bindingId);
42
+ if (inspection.state !== 'managed')
43
+ throw new Error('Jira ADF managed anchor is absent.');
44
+ const next = cloneDocument(document);
45
+ const index = managedIndexes(next, bindingId).indexes[0];
46
+ next.content[index] = managedNode(bindingId, content);
47
+ assertDocument(next);
48
+ assertSurroundingPreserved(document, next, bindingId);
49
+ return next;
50
+ }
51
+ export function verifyJiraAdfReplacement(before, after, bindingId, expectedContent) {
52
+ try {
53
+ assertSurroundingPreserved(before, after, bindingId);
54
+ const inspection = inspectJiraAdf(after, bindingId);
55
+ return (inspection.state === 'managed' &&
56
+ inspection.managedText === expectedContent);
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ }
62
+ function managedNode(bindingId, content) {
63
+ assertManagedText(content);
64
+ return {
65
+ type: 'panel',
66
+ attrs: { panelType: 'info', localId: `${MARKER_PREFIX}${bindingId}` },
67
+ content: [
68
+ { type: 'paragraph', content: [{ type: 'text', text: content }] },
69
+ ],
70
+ };
71
+ }
72
+ function managedIndexes(document, bindingId) {
73
+ const marker = `${MARKER_PREFIX}${bindingId}`;
74
+ const indexes = [];
75
+ let malformed = false;
76
+ const visit = (node, topLevelIndex, depth) => {
77
+ const localId = node.attrs?.localId;
78
+ if (typeof localId === 'string' && localId.startsWith(MARKER_PREFIX)) {
79
+ if (depth !== 0 ||
80
+ localId !== marker ||
81
+ node.type !== 'panel' ||
82
+ !Array.isArray(node.content)) {
83
+ malformed = true;
84
+ }
85
+ else {
86
+ indexes.push(topLevelIndex);
87
+ }
88
+ }
89
+ for (const child of node.content ?? [])
90
+ visit(child, topLevelIndex, depth + 1);
91
+ };
92
+ document.content.forEach((node, index) => visit(node, index, 0));
93
+ return { indexes, malformed };
94
+ }
95
+ function extractManagedText(node) {
96
+ const paragraph = node.content;
97
+ if (paragraph?.length !== 1 ||
98
+ paragraph[0]?.type !== 'paragraph' ||
99
+ paragraph[0].content?.length !== 1 ||
100
+ paragraph[0].content[0]?.type !== 'text' ||
101
+ typeof paragraph[0].content[0].text !== 'string') {
102
+ throw new Error('Jira ADF managed content is malformed.');
103
+ }
104
+ return paragraph[0].content[0].text;
105
+ }
106
+ function assertSurroundingPreserved(before, after, bindingId) {
107
+ const beforeInspection = inspectJiraAdf(before, bindingId);
108
+ const afterInspection = inspectJiraAdf(after, bindingId);
109
+ if (beforeInspection.surroundingDigest !== afterInspection.surroundingDigest) {
110
+ throw new Error('Jira ADF surrounding content was not structurally preserved.');
111
+ }
112
+ }
113
+ function assertDocument(document) {
114
+ if (!isRecord(document) ||
115
+ document.type !== 'doc' ||
116
+ document.version !== 1 ||
117
+ !Array.isArray(document.content)) {
118
+ throw new Error('Jira ADF document is invalid or exceeds its byte limit.');
119
+ }
120
+ let encoded;
121
+ try {
122
+ encoded = JSON.stringify(document);
123
+ }
124
+ catch {
125
+ throw new Error('Jira ADF document is invalid or exceeds its byte limit.');
126
+ }
127
+ if (Buffer.byteLength(encoded, 'utf8') > JIRA_ADF_LIMITS.maxDocumentBytes) {
128
+ throw new Error('Jira ADF document is invalid or exceeds its byte limit.');
129
+ }
130
+ const counter = { nodes: 0 };
131
+ for (const node of document.content)
132
+ validateNode(node, 0, counter);
133
+ }
134
+ function validateNode(value, depth, counter) {
135
+ counter.nodes += 1;
136
+ if (!isRecord(value) ||
137
+ typeof value.type !== 'string' ||
138
+ value.type.length === 0 ||
139
+ depth > JIRA_ADF_LIMITS.maxDepth ||
140
+ counter.nodes > JIRA_ADF_LIMITS.maxNodes ||
141
+ (value.attrs !== undefined && !isRecord(value.attrs)) ||
142
+ (value.text !== undefined && typeof value.text !== 'string') ||
143
+ (value.marks !== undefined &&
144
+ (!Array.isArray(value.marks) ||
145
+ value.marks.some((mark) => !isRecord(mark)))) ||
146
+ (value.content !== undefined && !Array.isArray(value.content))) {
147
+ throw new Error('Jira ADF document is invalid or exceeds its structural limits.');
148
+ }
149
+ for (const child of value.content ?? []) {
150
+ validateNode(child, depth + 1, counter);
151
+ }
152
+ }
153
+ function isRecord(value) {
154
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
155
+ }
156
+ function assertBindingId(bindingId) {
157
+ if (!bindingId ||
158
+ Buffer.byteLength(bindingId, 'utf8') > JIRA_ADF_LIMITS.maxBindingIdBytes) {
159
+ throw new Error('Jira ADF binding identity is invalid.');
160
+ }
161
+ }
162
+ function assertManagedText(content) {
163
+ if (Buffer.byteLength(content, 'utf8') > JIRA_ADF_LIMITS.maxManagedTextBytes) {
164
+ throw new Error('Jira ADF managed content exceeds its byte limit.');
165
+ }
166
+ }
167
+ function cloneDocument(document) {
168
+ return structuredClone(document);
169
+ }
@@ -0,0 +1,163 @@
1
+ import { type ExternalActionEnvelope } from './external-action.js';
2
+ import { type HostCapabilityEvidence } from './host-execution.js';
3
+ import { type OutboundProjection, type OutboundProjectionSafetyResult } from './outbound-projection-safety.js';
4
+ import { type PreviewApproval } from './preview.js';
5
+ import { type ProviderAdapter } from './provider.js';
6
+ import type { RemoteSnapshotRecord } from './schema.js';
7
+ import { type SanitizableRemoteSnapshot } from './snapshot.js';
8
+ export interface LifecycleBinding {
9
+ bindingId: string;
10
+ provider: 'github' | 'linear' | 'jira';
11
+ context: Record<string, string>;
12
+ localTargetId: string;
13
+ snapshot: RemoteSnapshotRecord | null;
14
+ baseline: LifecycleBaseline | null;
15
+ }
16
+ export interface LifecycleBaseline {
17
+ acceptedAt: string;
18
+ fields: {
19
+ title: string;
20
+ description: string | null;
21
+ priority: string | null;
22
+ };
23
+ localRevision: string;
24
+ remoteRevisionDigest: string;
25
+ }
26
+ export interface LifecycleStore {
27
+ readBinding(bindingId: string): Promise<LifecycleBinding | null>;
28
+ commitRefresh(bindingId: string, snapshot: RemoteSnapshotRecord): Promise<void>;
29
+ commitIntake(input: {
30
+ binding: LifecycleBinding;
31
+ snapshot: RemoteSnapshotRecord;
32
+ baseline: LifecycleBaseline;
33
+ mode: 'create' | 'enrich';
34
+ }): Promise<void>;
35
+ }
36
+ export interface LifecycleReadProvider {
37
+ adapter: ProviderAdapter;
38
+ read(input: {
39
+ provider: LifecycleBinding['provider'];
40
+ context: Record<string, string>;
41
+ stableId?: string;
42
+ }): Promise<{
43
+ observation: Parameters<ProviderAdapter['normalize']>[0];
44
+ snapshot: SanitizableRemoteSnapshot;
45
+ allowedExtensionKeys?: string[];
46
+ }>;
47
+ }
48
+ export interface LifecycleDependencies {
49
+ store: LifecycleStore;
50
+ provider: LifecycleReadProvider;
51
+ now(): string;
52
+ }
53
+ export declare function refreshBinding(bindingId: string, dependencies: LifecycleDependencies): Promise<{
54
+ status: 'ok';
55
+ snapshot: RemoteSnapshotRecord;
56
+ }>;
57
+ export declare function intakeRemoteIssue(input: {
58
+ binding: Omit<LifecycleBinding, 'snapshot' | 'baseline'>;
59
+ mode: 'create' | 'enrich';
60
+ localRevision: string;
61
+ }, dependencies: LifecycleDependencies): Promise<{
62
+ status: 'ok';
63
+ snapshot: RemoteSnapshotRecord;
64
+ baseline: LifecycleBaseline;
65
+ }>;
66
+ export declare function baselineRevisionDigest(baseline: LifecycleBaseline): string;
67
+ export declare function publishUnboundBinding<T>(input: T, dependencies: {
68
+ createAndBind(value: T): Promise<unknown>;
69
+ }): Promise<unknown>;
70
+ export interface ResolvedMutationAuthority {
71
+ effective: 'read-only' | 'user-authorized' | 'user-approved' | 'autonomous';
72
+ sourceDigest: string;
73
+ instructionDigest?: string;
74
+ approval?: PreviewApproval;
75
+ activeWorkflow?: {
76
+ workflowId: string;
77
+ revision: string;
78
+ };
79
+ }
80
+ export type CurrentMutationInvocation = {
81
+ kind: 'interactive';
82
+ invocationId: string;
83
+ evidenceDigest: string;
84
+ } | {
85
+ kind: 'workflow';
86
+ invocationId: string;
87
+ workflowId: string;
88
+ revision: string;
89
+ };
90
+ export interface MutationLifecycleStore {
91
+ persistPlanned(input: {
92
+ operationId: string;
93
+ bindingId: string;
94
+ previewDigest: string;
95
+ projectionDigest: string;
96
+ safetyResultDigest: string;
97
+ authority: ResolvedMutationAuthority;
98
+ }): Promise<void>;
99
+ markAttemptStarted(operationId: string, action: ExternalActionEnvelope, capability: HostCapabilityEvidence): Promise<void>;
100
+ markTerminal(operationId: string, status: 'verified' | 'blocked' | 'uncertain' | 'rejected', evidenceDigest: string): Promise<void>;
101
+ }
102
+ export interface MutationLifecycleDependencies {
103
+ store: MutationLifecycleStore;
104
+ preRead(input: {
105
+ binding: LifecycleBinding;
106
+ }): Promise<{
107
+ revisionDigest: string;
108
+ }>;
109
+ resolveCurrentAuthority(input: {
110
+ binding: LifecycleBinding;
111
+ operation: 'create' | 'update';
112
+ }): Promise<ResolvedMutationAuthority>;
113
+ currentInvocation(): Promise<CurrentMutationInvocation>;
114
+ recomputeAfterPreRead(input: {
115
+ binding: LifecycleBinding;
116
+ operation: 'create' | 'update';
117
+ revisionDigest: string;
118
+ }): Promise<{
119
+ projection: OutboundProjection;
120
+ outboundSafety: OutboundProjectionSafetyResult;
121
+ previewDigest: string;
122
+ policyDigest: string;
123
+ capabilityCandidates: HostCapabilityEvidence[];
124
+ }>;
125
+ now(): string;
126
+ approvalMaxAgeMs: number;
127
+ execute(action: ExternalActionEnvelope): Promise<{
128
+ classification: 'committed' | 'not-committed' | 'unknown';
129
+ evidenceDigest: string;
130
+ }>;
131
+ readBack(input: {
132
+ binding: LifecycleBinding;
133
+ action: ExternalActionEnvelope;
134
+ }): Promise<{
135
+ fields: OutboundProjection;
136
+ revisionDigest: string;
137
+ }>;
138
+ }
139
+ export interface PublishBindingInput {
140
+ operationId: string;
141
+ stepId: string;
142
+ binding: LifecycleBinding;
143
+ operation: 'create' | 'update';
144
+ projection: OutboundProjection;
145
+ outboundSafety: OutboundProjectionSafetyResult;
146
+ preview: {
147
+ digest: string;
148
+ observedRevisionDigest: string;
149
+ projectionDigest: string;
150
+ safetyResultDigest: string;
151
+ policyDigest: string;
152
+ capabilityEvidenceDigest: string;
153
+ createdAt: string;
154
+ };
155
+ }
156
+ export declare function publishBinding(input: PublishBindingInput, dependencies: MutationLifecycleDependencies): Promise<{
157
+ status: 'verified' | 'blocked' | 'uncertain' | 'rejected';
158
+ action?: ExternalActionEnvelope;
159
+ }>;
160
+ export declare function reconcileRemoteBinding(input: PublishBindingInput & {
161
+ conflicts: string[];
162
+ }, dependencies: MutationLifecycleDependencies): ReturnType<typeof publishBinding>;
163
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/commands/pjm/remote/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACjE,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,YAAY,CAAC,KAAK,EAAE;QAClB,OAAO,EAAE,gBAAgB,CAAC;QAC1B,QAAQ,EAAE,oBAAoB,CAAC;QAC/B,QAAQ,EAAE,iBAAiB,CAAC;QAC5B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,eAAe,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE;QACV,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QACV,WAAW,EAAE,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,QAAQ,EAAE,yBAAyB,CAAC;QACpC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,GAAG,IAAI,MAAM,CAAC;CACf;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAa3D;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE;IACL,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;IACzD,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB,EACD,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC;IACT,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC,CAiCD;AAsCD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAE1E;AAED,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,KAAK,EAAE,CAAC,EACR,YAAY,EAAE;IAAE,aAAa,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,GAC1D,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,WAAW,GAAG,iBAAiB,GAAG,eAAe,GAAG,YAAY,CAAC;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,cAAc,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACrE;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEN,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,KAAK,EAAE;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;QACzB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,SAAS,EAAE,yBAAyB,CAAC;KACtC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,sBAAsB,GACjC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,YAAY,CACV,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,EACzD,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,CAAC,KAAK,EAAE;QACb,OAAO,EAAE,gBAAgB,CAAC;KAC3B,GAAG,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxC,uBAAuB,CAAC,KAAK,EAAE;QAC7B,OAAO,EAAE,gBAAgB,CAAC;QAC1B,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAChC,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvC,iBAAiB,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACxD,qBAAqB,CAAC,KAAK,EAAE;QAC3B,OAAO,EAAE,gBAAgB,CAAC;QAC1B,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC;QACV,UAAU,EAAE,kBAAkB,CAAC;QAC/B,cAAc,EAAE,8BAA8B,CAAC;QAC/C,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;KAChD,CAAC,CAAC;IACH,GAAG,IAAI,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC;QAC/C,cAAc,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;QAC1D,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,EAAE;QACd,OAAO,EAAE,gBAAgB,CAAC;QAC1B,MAAM,EAAE,sBAAsB,CAAC;KAChC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,kBAAkB,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,cAAc,EAAE,8BAA8B,CAAC;IAC/C,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,sBAAsB,EAAE,MAAM,CAAC;QAC/B,gBAAgB,EAAE,MAAM,CAAC;QACzB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;QACrB,wBAAwB,EAAE,MAAM,CAAC;QACjC,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,YAAY,EAAE,6BAA6B,GAC1C,OAAO,CAAC;IACT,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAC1D,MAAM,CAAC,EAAE,sBAAsB,CAAC;CACjC,CAAC,CA0ID;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,mBAAmB,GAAG;IAAE,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,EACpD,YAAY,EAAE,6BAA6B,GAC1C,UAAU,CAAC,OAAO,cAAc,CAAC,CAGnC"}