@open-agent-toolkit/cli 0.2.5 → 0.2.6
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.
- package/assets/docs/cli-utilities/configuration.md +40 -0
- package/assets/docs/cli-utilities/tool-packs.md +31 -0
- package/assets/docs/workflows/projects/artifacts.md +27 -0
- package/assets/docs/workflows/skills/explainer-kit.md +125 -0
- package/assets/docs/workflows/skills/index.md +4 -0
- package/assets/migration/pjm-restructure.md +12 -0
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/explainer-kit/SKILL.md +95 -0
- package/assets/skills/explainer-kit/examples/project-explainer/content.md +31 -0
- package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +22 -0
- package/assets/skills/explainer-kit/examples/project-recap/content.md +34 -0
- package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +22 -0
- package/assets/skills/explainer-kit/examples/theme-bundle.json +87 -0
- package/assets/skills/explainer-kit/palettes/ember.json +37 -0
- package/assets/skills/explainer-kit/palettes/forest.json +37 -0
- package/assets/skills/explainer-kit/palettes/neutral.json +37 -0
- package/assets/skills/explainer-kit/palettes/ocean.json +37 -0
- package/assets/skills/explainer-kit/palettes/violet.json +37 -0
- package/assets/skills/explainer-kit/profiles/clean.json +42 -0
- package/assets/skills/explainer-kit/profiles/editorial.json +42 -0
- package/assets/skills/explainer-kit/profiles/technical.json +39 -0
- package/assets/skills/explainer-kit/recipes/engineer-tour.json +33 -0
- package/assets/skills/explainer-kit/recipes/program-recap.json +34 -0
- package/assets/skills/explainer-kit/recipes/project-explainer.json +33 -0
- package/assets/skills/explainer-kit/recipes/project-recap.json +34 -0
- package/assets/skills/explainer-kit/references/contracts.md +101 -0
- package/assets/skills/explainer-kit/references/destination-contract.md +94 -0
- package/assets/skills/explainer-kit/references/extension-contract.md +71 -0
- package/assets/skills/explainer-kit/references/fact-base-contract.md +119 -0
- package/assets/skills/explainer-kit/schemas/build-record.schema.json +92 -0
- package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +53 -0
- package/assets/skills/explainer-kit/schemas/fact-base.schema.json +129 -0
- package/assets/skills/explainer-kit/schemas/manifest.schema.json +193 -0
- package/assets/skills/explainer-kit/schemas/publish-receipt.schema.json +97 -0
- package/assets/skills/explainer-kit/schemas/publish-request.schema.json +32 -0
- package/assets/skills/explainer-kit/schemas/run-request.schema.json +132 -0
- package/assets/skills/explainer-kit/schemas/theme.schema.json +217 -0
- package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +180 -0
- package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +680 -0
- package/assets/skills/explainer-kit/scripts/lib/durability.mjs +538 -0
- package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +494 -0
- package/assets/skills/explainer-kit/scripts/lib/fs-safe.mjs +218 -0
- package/assets/skills/explainer-kit/scripts/lib/qa.mjs +512 -0
- package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +289 -0
- package/assets/skills/explainer-kit/scripts/lib/records.mjs +231 -0
- package/assets/skills/explainer-kit/scripts/lib/render.mjs +485 -0
- package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +587 -0
- package/assets/skills/explainer-kit/scripts/lib/safe-paths.mjs +96 -0
- package/assets/skills/explainer-kit/scripts/lib/theme.mjs +332 -0
- package/assets/skills/explainer-kit/scripts/publish.mjs +76 -0
- package/assets/skills/explainer-kit/scripts/record-durability.mjs +64 -0
- package/assets/skills/explainer-kit/scripts/render-qa.mjs +273 -0
- package/assets/skills/explainer-kit/scripts/run.mjs +778 -0
- package/assets/skills/explainer-kit/scripts/validate.mjs +59 -0
- package/assets/skills/explainer-kit/templates/deck-shell.html +233 -0
- package/assets/skills/explainer-kit/templates/diagram-shell.html +219 -0
- package/assets/skills/explainer-kit/templates/engineer-tour.html +273 -0
- package/assets/skills/explainer-kit/templates/house-style.html +218 -0
- package/assets/skills/oat-explainer-kit/SKILL.md +92 -0
- package/assets/skills/oat-explainer-kit/references/config-contract.md +67 -0
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +143 -0
- package/assets/skills/oat-explainer-kit/references/migration.md +143 -0
- package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +103 -0
- package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +127 -0
- package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +392 -0
- package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +130 -0
- package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +293 -0
- package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +209 -0
- package/assets/skills/oat-explainer-kit/scripts/resolve-paths.mjs +166 -0
- package/assets/skills/oat-explainer-kit/scripts/run.mjs +284 -0
- package/assets/skills/oat-project-autonomous/SKILL.md +22 -1
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +5 -1
- package/assets/skills/oat-project-complete/SKILL.md +166 -28
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +5 -1
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +17 -0
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +5 -1
- package/assets/skills/oat-project-plan/SKILL.md +30 -1
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +5 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +5 -1
- package/assets/skills/oat-project-summary/SKILL.md +20 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +232 -1
- package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
- package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/skill-manifest.js +2 -0
- package/dist/commands/project/archive/archive-utils.d.ts +12 -0
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +320 -8
- package/dist/commands/project/archive/index.d.ts.map +1 -1
- package/dist/commands/project/archive/index.js +1 -0
- package/dist/commands/project/archive/push-runner.d.ts +1 -0
- package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
- package/dist/commands/project/archive/push-runner.js +9 -2
- package/dist/config/oat-config.d.ts +26 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +88 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +18 -0
- package/dist/validation/project-state.d.ts +3 -0
- package/dist/validation/project-state.d.ts.map +1 -1
- package/dist/validation/project-state.js +91 -0
- package/package.json +2 -2
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { execFile as execFileCallback } from 'node:child_process';
|
|
2
|
-
import {
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { lstat, readFile, realpath, rename, rm, writeFile, } from 'node:fs/promises';
|
|
3
4
|
import { basename, dirname, isAbsolute, join, posix as path, relative, resolve, sep, } from 'node:path';
|
|
4
5
|
import { promisify } from 'node:util';
|
|
5
6
|
import { CliError } from '../../../errors/cli-error.js';
|
|
@@ -280,6 +281,304 @@ async function exportProjectSummary(archivePath, snapshotName, summaryExportPath
|
|
|
280
281
|
await copySummary(summarySource, summaryTarget);
|
|
281
282
|
return summaryTarget;
|
|
282
283
|
}
|
|
284
|
+
function parseProjectRecapManifest(contents) {
|
|
285
|
+
let value;
|
|
286
|
+
try {
|
|
287
|
+
value = JSON.parse(contents);
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
throw new CliError('Selected project recap has an invalid manifest.json.');
|
|
291
|
+
}
|
|
292
|
+
if (!isProjectRecapManifestV1(value)) {
|
|
293
|
+
throw new CliError('Selected project recap manifest does not match the explainer-kit manifest contract.');
|
|
294
|
+
}
|
|
295
|
+
const expectedImmutablePaths = new Set([
|
|
296
|
+
value.source.factBasePath,
|
|
297
|
+
'source/fact-base.md',
|
|
298
|
+
value.theme.path,
|
|
299
|
+
...value.artifacts.flatMap((artifact) => [
|
|
300
|
+
artifact.contentPath,
|
|
301
|
+
...(artifact.status === 'built' &&
|
|
302
|
+
typeof artifact.renderedPath === 'string'
|
|
303
|
+
? [artifact.renderedPath]
|
|
304
|
+
: []),
|
|
305
|
+
]),
|
|
306
|
+
]);
|
|
307
|
+
const recordedImmutablePaths = Object.keys(value.immutableHashes);
|
|
308
|
+
if (expectedImmutablePaths.size === 0 ||
|
|
309
|
+
expectedImmutablePaths.size !== recordedImmutablePaths.length ||
|
|
310
|
+
[...expectedImmutablePaths].some((relativePath) => !(relativePath in value.immutableHashes)) ||
|
|
311
|
+
value.source.factBaseHash !==
|
|
312
|
+
value.immutableHashes[value.source.factBasePath] ||
|
|
313
|
+
value.theme.hash !== value.immutableHashes[value.theme.path] ||
|
|
314
|
+
value.artifacts.some((artifact) => artifact.status === 'built' &&
|
|
315
|
+
typeof artifact.renderedPath === 'string' &&
|
|
316
|
+
artifact.hash !== value.immutableHashes[artifact.renderedPath])) {
|
|
317
|
+
throw new CliError('Selected project recap manifest immutable hashes do not cover the complete v1 package.');
|
|
318
|
+
}
|
|
319
|
+
return value;
|
|
320
|
+
}
|
|
321
|
+
function isProjectRecapManifestV1(value) {
|
|
322
|
+
if (!isRecord(value) ||
|
|
323
|
+
!hasExactKeys(value, [
|
|
324
|
+
'schemaVersion',
|
|
325
|
+
'runId',
|
|
326
|
+
'slug',
|
|
327
|
+
'recipe',
|
|
328
|
+
'createdAt',
|
|
329
|
+
'source',
|
|
330
|
+
'theme',
|
|
331
|
+
'artifacts',
|
|
332
|
+
'immutableHashes',
|
|
333
|
+
'outcome',
|
|
334
|
+
'buildRecord',
|
|
335
|
+
'warnings',
|
|
336
|
+
], ['publishReceipt']) ||
|
|
337
|
+
value.schemaVersion !== 'explainer-kit.manifest/v1' ||
|
|
338
|
+
!isNonEmptyString(value.runId) ||
|
|
339
|
+
typeof value.slug !== 'string' ||
|
|
340
|
+
!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value.slug) ||
|
|
341
|
+
!isDateTime(value.createdAt) ||
|
|
342
|
+
!isRecord(value.recipe) ||
|
|
343
|
+
!hasExactKeys(value.recipe, ['id', 'version']) ||
|
|
344
|
+
!isNonEmptyString(value.recipe.id) ||
|
|
345
|
+
!isNonEmptyString(value.recipe.version) ||
|
|
346
|
+
!isRecord(value.source) ||
|
|
347
|
+
!hasExactKeys(value.source, ['factBasePath', 'factBaseHash', 'inputHashes'], ['sourceRevision']) ||
|
|
348
|
+
!isSafeRelativePath(value.source.factBasePath) ||
|
|
349
|
+
!isSha256(value.source.factBaseHash) ||
|
|
350
|
+
!isHashMap(value.source.inputHashes) ||
|
|
351
|
+
(value.source.sourceRevision !== undefined &&
|
|
352
|
+
!isNonEmptyString(value.source.sourceRevision)) ||
|
|
353
|
+
!isRecord(value.theme) ||
|
|
354
|
+
!hasExactKeys(value.theme, ['path', 'hash', 'derived']) ||
|
|
355
|
+
value.theme.path !== 'theme.resolved.json' ||
|
|
356
|
+
!isSha256(value.theme.hash) ||
|
|
357
|
+
typeof value.theme.derived !== 'boolean' ||
|
|
358
|
+
!Array.isArray(value.artifacts) ||
|
|
359
|
+
!value.artifacts.every(isManifestArtifact) ||
|
|
360
|
+
new Set(value.artifacts.map((artifact) => JSON.stringify(artifact)))
|
|
361
|
+
.size !== value.artifacts.length ||
|
|
362
|
+
!isHashMap(value.immutableHashes) ||
|
|
363
|
+
!['built-durable', 'built-not-durable', 'failed', 'incomplete'].includes(String(value.outcome)) ||
|
|
364
|
+
!isPathHashRecord(value.buildRecord, 'build-record.json') ||
|
|
365
|
+
(value.publishReceipt !== undefined &&
|
|
366
|
+
!isPathHashRecord(value.publishReceipt, 'publish-receipt.json')) ||
|
|
367
|
+
!Array.isArray(value.warnings) ||
|
|
368
|
+
!value.warnings.every(isNonEmptyString)) {
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
return true;
|
|
372
|
+
}
|
|
373
|
+
function isManifestArtifact(value) {
|
|
374
|
+
if (!isRecord(value) ||
|
|
375
|
+
!hasExactKeys(value, ['id', 'type', 'contentPath', 'status', 'rebuildable'], [
|
|
376
|
+
'renderedPath',
|
|
377
|
+
'mediaType',
|
|
378
|
+
'hash',
|
|
379
|
+
'rebuild',
|
|
380
|
+
'durableEvidence',
|
|
381
|
+
'failure',
|
|
382
|
+
]) ||
|
|
383
|
+
!isNonEmptyString(value.id) ||
|
|
384
|
+
!['hub', 'diagram', 'explainer', 'deck', 'catalog'].includes(String(value.type)) ||
|
|
385
|
+
!isSafeRelativePath(value.contentPath) ||
|
|
386
|
+
!['built', 'failed', 'skipped'].includes(String(value.status)) ||
|
|
387
|
+
typeof value.rebuildable !== 'boolean' ||
|
|
388
|
+
(value.renderedPath !== undefined &&
|
|
389
|
+
(!isSafeRelativePath(value.renderedPath) ||
|
|
390
|
+
!value.renderedPath.startsWith('site/'))) ||
|
|
391
|
+
(value.mediaType !== undefined && !isNonEmptyString(value.mediaType)) ||
|
|
392
|
+
(value.hash !== undefined && !isSha256(value.hash)) ||
|
|
393
|
+
(value.status === 'built' && !isSha256(value.hash)) ||
|
|
394
|
+
(value.rebuildable === true && !isRebuildRecord(value.rebuild)) ||
|
|
395
|
+
(value.rebuild !== undefined && !isRebuildRecord(value.rebuild)) ||
|
|
396
|
+
(value.durableEvidence !== undefined &&
|
|
397
|
+
(!Array.isArray(value.durableEvidence) ||
|
|
398
|
+
!value.durableEvidence.every(isDurableEvidence))) ||
|
|
399
|
+
(value.failure !== undefined && !isFailureRecord(value.failure))) {
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
function isRebuildRecord(value) {
|
|
405
|
+
return (isRecord(value) &&
|
|
406
|
+
hasExactKeys(value, ['argv', 'cwd', 'inputHashes']) &&
|
|
407
|
+
Array.isArray(value.argv) &&
|
|
408
|
+
value.argv.length > 0 &&
|
|
409
|
+
value.argv.every((argument) => typeof argument === 'string') &&
|
|
410
|
+
isNonEmptyString(value.cwd) &&
|
|
411
|
+
isHashMap(value.inputHashes));
|
|
412
|
+
}
|
|
413
|
+
function isDurableEvidence(value) {
|
|
414
|
+
return (isRecord(value) &&
|
|
415
|
+
hasExactKeys(value, ['kind', 'ref', 'paths', 'attestedAt'], ['supersedes']) &&
|
|
416
|
+
['commit', 'publish'].includes(String(value.kind)) &&
|
|
417
|
+
isNonEmptyString(value.ref) &&
|
|
418
|
+
isUniqueSafePathArray(value.paths) &&
|
|
419
|
+
isDateTime(value.attestedAt) &&
|
|
420
|
+
(value.supersedes === undefined ||
|
|
421
|
+
(isRecord(value.supersedes) &&
|
|
422
|
+
hasExactKeys(value.supersedes, ['ref', 'paths']) &&
|
|
423
|
+
isNonEmptyString(value.supersedes.ref) &&
|
|
424
|
+
isUniqueSafePathArray(value.supersedes.paths))));
|
|
425
|
+
}
|
|
426
|
+
function isFailureRecord(value) {
|
|
427
|
+
return (isRecord(value) &&
|
|
428
|
+
hasExactKeys(value, ['code', 'message', 'recovery']) &&
|
|
429
|
+
isNonEmptyString(value.code) &&
|
|
430
|
+
isNonEmptyString(value.message) &&
|
|
431
|
+
Array.isArray(value.recovery) &&
|
|
432
|
+
value.recovery.length > 0 &&
|
|
433
|
+
value.recovery.every(isNonEmptyString));
|
|
434
|
+
}
|
|
435
|
+
function isPathHashRecord(value, expectedPath) {
|
|
436
|
+
return (isRecord(value) &&
|
|
437
|
+
hasExactKeys(value, ['path', 'hash']) &&
|
|
438
|
+
value.path === expectedPath &&
|
|
439
|
+
isSha256(value.hash));
|
|
440
|
+
}
|
|
441
|
+
function isHashMap(value) {
|
|
442
|
+
return (isRecord(value) &&
|
|
443
|
+
Object.entries(value).every(([relativePath, hash]) => isSafeRelativePath(relativePath) && isSha256(hash)));
|
|
444
|
+
}
|
|
445
|
+
function isUniqueSafePathArray(value) {
|
|
446
|
+
return (Array.isArray(value) &&
|
|
447
|
+
value.length > 0 &&
|
|
448
|
+
value.every(isSafeRelativePath) &&
|
|
449
|
+
new Set(value).size === value.length);
|
|
450
|
+
}
|
|
451
|
+
function isRecord(value) {
|
|
452
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
453
|
+
}
|
|
454
|
+
function hasExactKeys(value, required, optional = []) {
|
|
455
|
+
const allowed = new Set([...required, ...optional]);
|
|
456
|
+
return (required.every((key) => key in value) &&
|
|
457
|
+
Object.keys(value).every((key) => allowed.has(key)));
|
|
458
|
+
}
|
|
459
|
+
function isNonEmptyString(value) {
|
|
460
|
+
return typeof value === 'string' && value.length > 0;
|
|
461
|
+
}
|
|
462
|
+
function isDateTime(value) {
|
|
463
|
+
return (typeof value === 'string' &&
|
|
464
|
+
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/.test(value) &&
|
|
465
|
+
!Number.isNaN(Date.parse(value)));
|
|
466
|
+
}
|
|
467
|
+
function isSafeRelativePath(value) {
|
|
468
|
+
return (typeof value === 'string' &&
|
|
469
|
+
value.length > 0 &&
|
|
470
|
+
!isAbsolute(value) &&
|
|
471
|
+
!value.includes('\\') &&
|
|
472
|
+
value.split('/').every((segment) => segment !== '' && segment !== '..'));
|
|
473
|
+
}
|
|
474
|
+
function isSha256(value) {
|
|
475
|
+
return typeof value === 'string' && /^sha256:[a-f0-9]{64}$/.test(value);
|
|
476
|
+
}
|
|
477
|
+
async function pathExists(target) {
|
|
478
|
+
try {
|
|
479
|
+
await lstat(target);
|
|
480
|
+
return true;
|
|
481
|
+
}
|
|
482
|
+
catch (error) {
|
|
483
|
+
if (typeof error === 'object' &&
|
|
484
|
+
error !== null &&
|
|
485
|
+
'code' in error &&
|
|
486
|
+
error.code === 'ENOENT') {
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
throw error;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
function assertInsideExplainers(explainersRoot, selectedRunRoot) {
|
|
493
|
+
if (selectedRunRoot === explainersRoot ||
|
|
494
|
+
!isInsidePath(explainersRoot, selectedRunRoot)) {
|
|
495
|
+
throw new CliError('Selected project recap run must be inside the project `explainers/` directory.');
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
async function resolveSelectedProjectRecapRun(projectPath, projectRecapRun) {
|
|
499
|
+
const explainersRoot = resolve(projectPath, 'explainers');
|
|
500
|
+
const selectedRunRoot = resolve(projectPath, projectRecapRun);
|
|
501
|
+
assertInsideExplainers(explainersRoot, selectedRunRoot);
|
|
502
|
+
const [realExplainersRoot, realSelectedRunRoot] = await Promise.all([
|
|
503
|
+
realpath(explainersRoot),
|
|
504
|
+
realpath(selectedRunRoot),
|
|
505
|
+
]);
|
|
506
|
+
assertInsideExplainers(realExplainersRoot, realSelectedRunRoot);
|
|
507
|
+
return selectedRunRoot;
|
|
508
|
+
}
|
|
509
|
+
function parseExpectedSha256(value, relativePath) {
|
|
510
|
+
const match = value.match(/^sha256:([a-f0-9]{64})$/);
|
|
511
|
+
if (!match?.[1]) {
|
|
512
|
+
throw new CliError(`Selected project recap manifest has an invalid hash for \`${relativePath}\`.`);
|
|
513
|
+
}
|
|
514
|
+
return match[1];
|
|
515
|
+
}
|
|
516
|
+
async function verifyProjectRecapImmutableHashes(stagedRoot, manifest) {
|
|
517
|
+
const entries = Object.entries(manifest.immutableHashes);
|
|
518
|
+
const realStagedRoot = await realpath(stagedRoot);
|
|
519
|
+
for (const [relativePath, expectedHash] of entries) {
|
|
520
|
+
const artifactPath = resolve(stagedRoot, relativePath);
|
|
521
|
+
if (artifactPath === stagedRoot ||
|
|
522
|
+
!isInsidePath(stagedRoot, artifactPath)) {
|
|
523
|
+
throw new CliError(`Selected project recap manifest path \`${relativePath}\` escapes the recap package.`);
|
|
524
|
+
}
|
|
525
|
+
const realArtifactPath = await realpath(artifactPath);
|
|
526
|
+
if (!isInsidePath(realStagedRoot, realArtifactPath)) {
|
|
527
|
+
throw new CliError(`Selected project recap manifest path \`${relativePath}\` escapes the recap package.`);
|
|
528
|
+
}
|
|
529
|
+
const actualHash = createHash('sha256')
|
|
530
|
+
.update(await readFile(realArtifactPath))
|
|
531
|
+
.digest('hex');
|
|
532
|
+
if (actualHash !== parseExpectedSha256(expectedHash, relativePath)) {
|
|
533
|
+
throw new CliError(`Selected project recap hash verification failed for \`${relativePath}\`.`);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return entries.length;
|
|
537
|
+
}
|
|
538
|
+
async function exportSelectedProjectRecap(options, snapshotName, dependencies) {
|
|
539
|
+
const selectedRun = options.projectRecapRun?.trim();
|
|
540
|
+
if (!selectedRun) {
|
|
541
|
+
return null;
|
|
542
|
+
}
|
|
543
|
+
const sourceRunRoot = await resolveSelectedProjectRecapRun(options.projectPath, selectedRun);
|
|
544
|
+
const sourceManifestContents = await readFile(join(sourceRunRoot, 'manifest.json'), 'utf8');
|
|
545
|
+
const sourceManifest = parseProjectRecapManifest(sourceManifestContents);
|
|
546
|
+
if (sourceManifest.recipe.id !== 'project-recap') {
|
|
547
|
+
throw new CliError('Selected project recap manifest recipe must be exactly `project-recap`.');
|
|
548
|
+
}
|
|
549
|
+
const exportRoot = join(options.repoRoot, '.oat', 'repo', 'reference', 'project-recaps', snapshotName);
|
|
550
|
+
if (await pathExists(exportRoot)) {
|
|
551
|
+
throw new CliError(`Project recap export destination \`${exportRoot}\` already exists; refusing to overwrite it.`);
|
|
552
|
+
}
|
|
553
|
+
const temporaryRoot = `${exportRoot}.tmp-${randomUUID()}`;
|
|
554
|
+
const makeDir = dependencies.ensureDir ?? ensureDir;
|
|
555
|
+
const copyProjectDirectory = dependencies.copyDirectory ?? copyDirectory;
|
|
556
|
+
const removePath = dependencies.removePath ??
|
|
557
|
+
(async (target, removeOptions) => rm(target, removeOptions));
|
|
558
|
+
const renamePath = dependencies.renamePath ?? rename;
|
|
559
|
+
await makeDir(dirname(exportRoot));
|
|
560
|
+
try {
|
|
561
|
+
await copyProjectDirectory(sourceRunRoot, temporaryRoot);
|
|
562
|
+
const stagedManifestContents = await readFile(join(temporaryRoot, 'manifest.json'), 'utf8');
|
|
563
|
+
if (stagedManifestContents !== sourceManifestContents) {
|
|
564
|
+
throw new CliError('Selected project recap manifest changed while staging the export.');
|
|
565
|
+
}
|
|
566
|
+
const verifiedArtifactCount = await verifyProjectRecapImmutableHashes(temporaryRoot, sourceManifest);
|
|
567
|
+
await renamePath(temporaryRoot, exportRoot);
|
|
568
|
+
return {
|
|
569
|
+
sourceRunRoot,
|
|
570
|
+
exportRoot,
|
|
571
|
+
manifest: {
|
|
572
|
+
relativePath: 'manifest.json',
|
|
573
|
+
verifiedArtifactCount,
|
|
574
|
+
},
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
catch (error) {
|
|
578
|
+
await removePath(temporaryRoot, { recursive: true, force: true });
|
|
579
|
+
throw error;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
283
582
|
export async function archiveProjectOnCompletion(options, dependencies = {}) {
|
|
284
583
|
const makeDir = dependencies.ensureDir ?? ensureDir;
|
|
285
584
|
const copyProjectDirectory = dependencies.copyDirectory ?? copyDirectory;
|
|
@@ -296,13 +595,25 @@ export async function archiveProjectOnCompletion(options, dependencies = {}) {
|
|
|
296
595
|
}, dependencies);
|
|
297
596
|
assertDurableArchiveProjectTarget(archiveTarget);
|
|
298
597
|
const archivePath = archiveTarget.archivePath;
|
|
299
|
-
await
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
598
|
+
const projectRecapExport = await exportSelectedProjectRecap(options, snapshotName, dependencies);
|
|
599
|
+
try {
|
|
600
|
+
await makeDir(dirname(archivePath));
|
|
601
|
+
await copyProjectDirectory(options.projectPath, archivePath);
|
|
602
|
+
await writeArchiveSnapshotMetadata(archivePath, {
|
|
603
|
+
projectName: options.projectName,
|
|
604
|
+
snapshotName,
|
|
605
|
+
});
|
|
606
|
+
await removePath(options.projectPath, { recursive: true, force: true });
|
|
607
|
+
}
|
|
608
|
+
catch (error) {
|
|
609
|
+
if (projectRecapExport) {
|
|
610
|
+
await removePath(projectRecapExport.exportRoot, {
|
|
611
|
+
recursive: true,
|
|
612
|
+
force: true,
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
throw error;
|
|
616
|
+
}
|
|
306
617
|
const warnings = [];
|
|
307
618
|
let summaryExportFile = null;
|
|
308
619
|
if (options.summaryExportPath) {
|
|
@@ -354,6 +665,7 @@ export async function archiveProjectOnCompletion(options, dependencies = {}) {
|
|
|
354
665
|
archivePath,
|
|
355
666
|
s3Path,
|
|
356
667
|
summaryExportFile,
|
|
668
|
+
projectRecapExport,
|
|
357
669
|
warnings,
|
|
358
670
|
};
|
|
359
671
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAIL,KAAK,qCAAqC,EAC3C,MAAM,eAAe,CAAC;AACvB,OAAO,EAIL,KAAK,iCAAiC,EACvC,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,kBAAkB,EAClB,iCAAiC,GAClC,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kBAAkB,EAClB,qCAAqC,GACtC,MAAM,eAAe,CAAC;AAEvB,KAAK,0BAA0B,GAAG,iCAAiC,GACjE,qCAAqC,CAAC;AAKxC,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAIL,KAAK,qCAAqC,EAC3C,MAAM,eAAe,CAAC;AACvB,OAAO,EAIL,KAAK,iCAAiC,EACvC,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,kBAAkB,EAClB,iCAAiC,GAClC,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kBAAkB,EAClB,qCAAqC,GACtC,MAAM,eAAe,CAAC;AAEvB,KAAK,0BAA0B,GAAG,iCAAiC,GACjE,qCAAqC,CAAC;AAKxC,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,OAAO,CA6ET"}
|
|
@@ -13,6 +13,7 @@ export function createProjectArchiveCommand(overrides = {}) {
|
|
|
13
13
|
.description('Manage archived project data')
|
|
14
14
|
.argument('[project-path]', 'Project path to archive')
|
|
15
15
|
.option('--dry-run', 'Preview archive without moving files or syncing S3')
|
|
16
|
+
.option('--project-recap-run <path>', 'Export the selected project-relative recap run before archiving')
|
|
16
17
|
.addHelpText('afterAll', '\nPull archived project data with `oat repo archive sync [project-name]`; `oat project archive sync` is deprecated.')
|
|
17
18
|
.action(async (projectPath, options, command) => {
|
|
18
19
|
const context = dependencies.buildCommandContext(readGlobalOptions(command));
|
|
@@ -3,6 +3,7 @@ import { type OatConfig, type OatLocalConfig } from '../../../config/oat-config.
|
|
|
3
3
|
import { resolveArchiveProjectTarget, resolvePrimaryRepoRoot, type ArchiveProjectOnCompletionOptions, type ArchiveProjectOnCompletionResult } from './archive-utils.js';
|
|
4
4
|
export interface ArchivePushOptions {
|
|
5
5
|
dryRun?: boolean;
|
|
6
|
+
projectRecapRun?: string;
|
|
6
7
|
}
|
|
7
8
|
export interface ProjectArchivePushCommandDependencies {
|
|
8
9
|
buildCommandContext: (options: Parameters<typeof buildCommandContext>[0]) => CommandContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-runner.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/push-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAKL,2BAA2B,EAC3B,sBAAsB,EAEtB,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,
|
|
1
|
+
{"version":3,"file":"push-runner.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/push-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAKL,2BAA2B,EAC3B,sBAAsB,EAEtB,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EAEtC,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,qCAAqC;IACpD,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD,2BAA2B,EAAE,OAAO,2BAA2B,CAAC;IAChE,0BAA0B,EAAE,CAC1B,OAAO,EAAE,iCAAiC,KACvC,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;IAC9B,SAAS,EAAE,MAAM,MAAM,CAAC;CACzB;AAmBD,wBAAgB,4CAA4C,IAAI,qCAAqC,CAapG;AAkJD,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,qCAAqC,EACnD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAoEf"}
|
|
@@ -40,7 +40,7 @@ async function resolveArchiveTarget(dependencies, repoRoot, projectPathArg) {
|
|
|
40
40
|
projectPath: absoluteProjectPath,
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
|
-
function buildArchiveOptions(repoRoot, config, projectsRoot, target) {
|
|
43
|
+
function buildArchiveOptions(repoRoot, config, projectsRoot, target, options) {
|
|
44
44
|
return {
|
|
45
45
|
repoRoot,
|
|
46
46
|
projectPath: target.projectPath,
|
|
@@ -49,6 +49,7 @@ function buildArchiveOptions(repoRoot, config, projectsRoot, target) {
|
|
|
49
49
|
s3Uri: config.archive?.s3Uri,
|
|
50
50
|
s3SyncOnComplete: config.archive?.s3SyncOnComplete ?? false,
|
|
51
51
|
summaryExportPath: config.archive?.summaryExportPath,
|
|
52
|
+
projectRecapRun: options.projectRecapRun,
|
|
52
53
|
awsProfile: config.archive?.awsProfile,
|
|
53
54
|
awsRegion: config.archive?.awsRegion,
|
|
54
55
|
};
|
|
@@ -94,6 +95,9 @@ function emitArchivePushText(report, summaryExportPath, logger) {
|
|
|
94
95
|
if (report.summaryExportFile) {
|
|
95
96
|
logger.info(`Summary export: ${report.summaryExportFile}`);
|
|
96
97
|
}
|
|
98
|
+
if (report.projectRecapExport) {
|
|
99
|
+
logger.info(`Project recap export: ${report.projectRecapExport.exportRoot}`);
|
|
100
|
+
}
|
|
97
101
|
}
|
|
98
102
|
function emitArchivePushReport(report, summaryExportPath, context) {
|
|
99
103
|
if (context.json) {
|
|
@@ -124,7 +128,7 @@ export async function runArchivePushCommand(dependencies, projectPathArg, option
|
|
|
124
128
|
process.exitCode = 0;
|
|
125
129
|
return;
|
|
126
130
|
}
|
|
127
|
-
const result = await dependencies.archiveProjectOnCompletion(buildArchiveOptions(repoRoot, config, projectsRoot, target));
|
|
131
|
+
const result = await dependencies.archiveProjectOnCompletion(buildArchiveOptions(repoRoot, config, projectsRoot, target, options));
|
|
128
132
|
const report = {
|
|
129
133
|
status: 'ok',
|
|
130
134
|
mode: 'apply',
|
|
@@ -133,6 +137,9 @@ export async function runArchivePushCommand(dependencies, projectPathArg, option
|
|
|
133
137
|
archivePath: result.archivePath,
|
|
134
138
|
s3Path: result.s3Path,
|
|
135
139
|
summaryExportFile: result.summaryExportFile,
|
|
140
|
+
...(result.projectRecapExport
|
|
141
|
+
? { projectRecapExport: result.projectRecapExport }
|
|
142
|
+
: {}),
|
|
136
143
|
warnings: result.warnings,
|
|
137
144
|
};
|
|
138
145
|
emitArchivePushReport(report, config.archive?.summaryExportPath, context);
|
|
@@ -18,6 +18,23 @@ export interface OatArchiveConfig {
|
|
|
18
18
|
awsProfile?: string;
|
|
19
19
|
awsRegion?: string;
|
|
20
20
|
}
|
|
21
|
+
export interface OatExplainerDefaultsConfig {
|
|
22
|
+
palette?: string;
|
|
23
|
+
visualProfile?: string;
|
|
24
|
+
themeBundlePath?: string;
|
|
25
|
+
}
|
|
26
|
+
export type OatExplainerPublishProvider = 's3-static';
|
|
27
|
+
export interface OatExplainerPublishConfig {
|
|
28
|
+
provider?: OatExplainerPublishProvider;
|
|
29
|
+
s3Uri?: string;
|
|
30
|
+
publicBaseUrl?: string;
|
|
31
|
+
awsRegion?: string;
|
|
32
|
+
awsProfile?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface OatExplainersConfig {
|
|
35
|
+
defaults?: OatExplainerDefaultsConfig;
|
|
36
|
+
publish?: OatExplainerPublishConfig;
|
|
37
|
+
}
|
|
21
38
|
export type WorkflowHillCheckpointDefault = 'every' | 'final';
|
|
22
39
|
export type WorkflowProjectLog = true | false | 'auto';
|
|
23
40
|
export type WorkflowPostImplementStep = 'summary' | 'document' | 'pr';
|
|
@@ -52,6 +69,11 @@ export interface WorkflowAutoArtifactReview {
|
|
|
52
69
|
plan?: boolean;
|
|
53
70
|
analysis?: boolean;
|
|
54
71
|
}
|
|
72
|
+
export type WorkflowExplainerPreference = 'always' | 'ask' | 'never';
|
|
73
|
+
export interface WorkflowExplainersConfig {
|
|
74
|
+
projectExplainer?: WorkflowExplainerPreference;
|
|
75
|
+
projectRecap?: WorkflowExplainerPreference;
|
|
76
|
+
}
|
|
55
77
|
export interface GateConfig {
|
|
56
78
|
command: string;
|
|
57
79
|
onFailure: GateOnFailure;
|
|
@@ -97,6 +119,7 @@ export interface OatWorkflowConfig {
|
|
|
97
119
|
dispatchCeiling?: WorkflowDispatchCeiling;
|
|
98
120
|
gateTimeouts?: WorkflowGateTimeouts;
|
|
99
121
|
gates?: WorkflowGatesConfig;
|
|
122
|
+
explainers?: WorkflowExplainersConfig;
|
|
100
123
|
}
|
|
101
124
|
export declare const VALID_CODEX_DISPATCH_CEILINGS: readonly WorkflowCodexDispatchCeiling[];
|
|
102
125
|
export declare const VALID_CLAUDE_DISPATCH_CEILINGS: readonly WorkflowClaudeDispatchCeiling[];
|
|
@@ -117,6 +140,7 @@ export interface OatConfig {
|
|
|
117
140
|
};
|
|
118
141
|
git?: OatGitConfig;
|
|
119
142
|
archive?: OatArchiveConfig;
|
|
143
|
+
explainers?: OatExplainersConfig;
|
|
120
144
|
tools?: OatToolsConfig;
|
|
121
145
|
documentation?: OatDocumentationConfig;
|
|
122
146
|
localPaths?: string[];
|
|
@@ -128,12 +152,14 @@ export interface OatLocalConfig {
|
|
|
128
152
|
activeProject?: string | null;
|
|
129
153
|
lastPausedProject?: string | null;
|
|
130
154
|
activeIdea?: string | null;
|
|
155
|
+
explainers?: OatExplainersConfig;
|
|
131
156
|
workflow?: OatWorkflowConfig;
|
|
132
157
|
}
|
|
133
158
|
export interface UserConfig {
|
|
134
159
|
version: number;
|
|
135
160
|
activeIdea?: string | null;
|
|
136
161
|
updateNotifications?: boolean;
|
|
162
|
+
explainers?: OatExplainersConfig;
|
|
137
163
|
workflow?: OatWorkflowConfig;
|
|
138
164
|
}
|
|
139
165
|
export interface ActiveProjectResolution {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,EAC9B,iCAAiC,EACjC,+BAA+B,EAC/B,iCAAiC,EACjC,2BAA2B,EAC3B,KAAK,6BAA6B,EAClC,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,gCAAgC,EACrC,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,GACjC,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,2BAA2B,GAAG,WAAW,CAAC;AAEtD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,2BAA2B,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IACtC,OAAO,CAAC,EAAE,yBAAyB,CAAC;CACrC;AAED,MAAM,MAAM,6BAA6B,GAAG,OAAO,GAAG,OAAO,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AACvD,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC;AACtE,MAAM,MAAM,mCAAmC,GAC3C,MAAM,GACN,SAAS,GACT,IAAI,GACJ,SAAS,CAAC;AACd,MAAM,WAAW,uCAAuC;IACtD,WAAW,EAAE,yBAAyB,EAAE,CAAC;IACzC,YAAY,EAAE,yBAAyB,EAAE,CAAC;CAC3C;AACD,MAAM,MAAM,6BAA6B,GACrC,mCAAmC,GACnC,uCAAuC,CAAC;AAC5C,MAAM,MAAM,4BAA4B,GACpC,UAAU,GACV,QAAQ,GACR,eAAe,CAAC;AACpB,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,WAAW,GAAG,OAAO,CAAC;AACzE,MAAM,MAAM,4BAA4B,GACpC,KAAK,GACL,QAAQ,GACR,MAAM,GACN,OAAO,GACP,KAAK,CAAC;AACV,MAAM,MAAM,6BAA6B,GACrC,OAAO,GACP,QAAQ,GACR,MAAM,GACN,OAAO,CAAC;AACZ,MAAM,MAAM,6BAA6B,GACrC,UAAU,GACV,SAAS,GACT,gBAAgB,CAAC;AACrB,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,SAAS,CAAC;AAC/D,MAAM,MAAM,6BAA6B,GACrC,SAAS,GACT,UAAU,GACV,MAAM,GACN,UAAU,GACV,UAAU,CAAC;AACf,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACxD,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,cAAc,GAAG,MAAM,CAAC;AAChE,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AACzC,eAAO,MAAM,mBAAmB,WAAa,CAAC;AAE9C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAOpE;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,6BAA6B,CAAC;IACvC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,0BAA0B,CAAC;IACjC,MAAM,CAAC,EAAE,6BAA6B,CAAC;CACxC;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,2BAA2B,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,CAAC,EAAE,2BAA2B,CAAC;IAC/C,YAAY,CAAC,EAAE,2BAA2B,CAAC;CAC5C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;CAC/C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,qBAAqB,CAAC,EAAE,6BAA6B,CAAC;IACtD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,6BAA6B,CAAC;IACtD,oBAAoB,CAAC,EAAE,4BAA4B,CAAC;IACpD,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;IAChD,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,wBAAwB,CAAC;CACvC;AAqCD,eAAO,MAAM,6BAA6B,EAAE,SAAS,4BAA4B,EACtC,CAAC;AAC5C,eAAO,MAAM,8BAA8B,EAAE,SAAS,6BAA6B,EAC7C,CAAC;AACvC,eAAO,MAAM,8BAA8B,EAAE,SAAS,6BAA6B,EACxC,CAAC;AAC5C,eAAO,MAAM,2BAA2B,EAAE,SAAS,0BAA0B,EACrD,CAAC;AACzB,eAAO,MAAM,+BAA+B,EAAE,SAAS,6BAA6B,EAC3B,CAAC;AAO1D,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CA0CrE,CAAC;AAEF,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,OAAO,GACb,uCAAuC,GAAG,SAAS,CA8CrD;AAED,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,uCAAuC,CAKlD;AA+aD,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC,MAAM,CACF,MAAM,GACN,OAAO,GACP,MAAM,GACN,WAAW,GACX,SAAS,GACT,oBAAoB,GACpB,UAAU,GACV,YAAY,EACd,OAAO,CACR,CACF,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;CACxC;AAuCD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACnC,MAAM,GAAG,IAAI,CA0Bf;AA0OD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAE7D;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAaxE;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAuBzB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,uBAAuB,CAAC,CAwClC;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,OAAO,CAAC,IAAI,CAAC,CAYf;AAsED,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,CAAC,CAarB;AAED,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6B5D"}
|
|
@@ -41,6 +41,7 @@ const VALID_DESIGN_MODES = [
|
|
|
41
41
|
'selective',
|
|
42
42
|
'draft',
|
|
43
43
|
];
|
|
44
|
+
const VALID_WORKFLOW_EXPLAINER_PREFERENCES = ['always', 'ask', 'never'];
|
|
44
45
|
export const VALID_CODEX_DISPATCH_CEILINGS = ['low', 'medium', 'high', 'xhigh', 'max'];
|
|
45
46
|
export const VALID_CLAUDE_DISPATCH_CEILINGS = ['haiku', 'sonnet', 'opus', 'fable'];
|
|
46
47
|
export const VALID_DISPATCH_CEILING_PRESETS = ['balanced', 'maximum', 'cost-conscious'];
|
|
@@ -244,6 +245,68 @@ function normalizeRecordMap(value, normalizeValue) {
|
|
|
244
245
|
}
|
|
245
246
|
return Object.keys(next).length > 0 ? next : undefined;
|
|
246
247
|
}
|
|
248
|
+
function normalizeExplainersConfig(parsed, scope) {
|
|
249
|
+
if (!isRecord(parsed)) {
|
|
250
|
+
return undefined;
|
|
251
|
+
}
|
|
252
|
+
const next = {};
|
|
253
|
+
if (isRecord(parsed.defaults)) {
|
|
254
|
+
const defaults = {};
|
|
255
|
+
const palette = trimNonEmptyString(parsed.defaults.palette);
|
|
256
|
+
if (palette !== undefined) {
|
|
257
|
+
defaults.palette = palette;
|
|
258
|
+
}
|
|
259
|
+
const visualProfile = trimNonEmptyString(parsed.defaults.visualProfile);
|
|
260
|
+
if (visualProfile !== undefined) {
|
|
261
|
+
defaults.visualProfile = visualProfile;
|
|
262
|
+
}
|
|
263
|
+
if (scope !== 'user') {
|
|
264
|
+
const rawPath = trimNonEmptyString(parsed.defaults.themeBundlePath);
|
|
265
|
+
if (rawPath !== undefined) {
|
|
266
|
+
const normalizedPath = normalizeToPosixPath(rawPath);
|
|
267
|
+
const escapesSharedScope = normalizedPath === '..' || normalizedPath.startsWith('../');
|
|
268
|
+
if (scope === 'local' ||
|
|
269
|
+
(!isAbsolute(normalizedPath) && !escapesSharedScope)) {
|
|
270
|
+
defaults.themeBundlePath = normalizedPath;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (Object.keys(defaults).length > 0) {
|
|
275
|
+
next.defaults = defaults;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (isRecord(parsed.publish)) {
|
|
279
|
+
const publish = {};
|
|
280
|
+
if (scope === 'shared') {
|
|
281
|
+
if (parsed.publish.provider === 's3-static') {
|
|
282
|
+
publish.provider = 's3-static';
|
|
283
|
+
}
|
|
284
|
+
const s3Uri = trimNonEmptyString(parsed.publish.s3Uri);
|
|
285
|
+
if (s3Uri !== undefined && /^s3:\/\/[^/\s]+(?:\/.*)?$/.test(s3Uri)) {
|
|
286
|
+
publish.s3Uri = s3Uri.replace(/\/+$/, '');
|
|
287
|
+
}
|
|
288
|
+
const publicBaseUrl = trimNonEmptyString(parsed.publish.publicBaseUrl);
|
|
289
|
+
if (publicBaseUrl !== undefined &&
|
|
290
|
+
/^https:\/\/[^/\s]+(?:\/.*)?$/.test(publicBaseUrl)) {
|
|
291
|
+
publish.publicBaseUrl = publicBaseUrl.replace(/\/+$/, '');
|
|
292
|
+
}
|
|
293
|
+
const awsRegion = trimNonEmptyString(parsed.publish.awsRegion);
|
|
294
|
+
if (awsRegion !== undefined) {
|
|
295
|
+
publish.awsRegion = awsRegion;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
const awsProfile = trimNonEmptyString(parsed.publish.awsProfile);
|
|
300
|
+
if (awsProfile !== undefined) {
|
|
301
|
+
publish.awsProfile = awsProfile;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (Object.keys(publish).length > 0) {
|
|
305
|
+
next.publish = publish;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return Object.keys(next).length > 0 ? next : undefined;
|
|
309
|
+
}
|
|
247
310
|
function normalizeWorkflowConfig(parsed) {
|
|
248
311
|
if (!isRecord(parsed)) {
|
|
249
312
|
return undefined;
|
|
@@ -368,6 +431,19 @@ function normalizeWorkflowConfig(parsed) {
|
|
|
368
431
|
next.gates = gates;
|
|
369
432
|
}
|
|
370
433
|
}
|
|
434
|
+
if (isRecord(parsed.explainers)) {
|
|
435
|
+
const explainers = {};
|
|
436
|
+
for (const key of ['projectExplainer', 'projectRecap']) {
|
|
437
|
+
const value = parsed.explainers[key];
|
|
438
|
+
if (typeof value === 'string' &&
|
|
439
|
+
VALID_WORKFLOW_EXPLAINER_PREFERENCES.includes(value)) {
|
|
440
|
+
explainers[key] = value;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
if (Object.keys(explainers).length > 0) {
|
|
444
|
+
next.explainers = explainers;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
371
447
|
return Object.keys(next).length > 0 ? next : undefined;
|
|
372
448
|
}
|
|
373
449
|
const DEFAULT_OAT_CONFIG = { version: 1 };
|
|
@@ -496,6 +572,10 @@ function normalizeOatConfig(parsed) {
|
|
|
496
572
|
next.archive = archive;
|
|
497
573
|
}
|
|
498
574
|
}
|
|
575
|
+
const explainers = normalizeExplainersConfig(parsed.explainers, 'shared');
|
|
576
|
+
if (explainers) {
|
|
577
|
+
next.explainers = explainers;
|
|
578
|
+
}
|
|
499
579
|
if (isRecord(parsed.tools)) {
|
|
500
580
|
const validPacks = [
|
|
501
581
|
'core',
|
|
@@ -582,6 +662,10 @@ function normalizeOatLocalConfig(repoRoot, parsed) {
|
|
|
582
662
|
? parsed.activeIdea.trim()
|
|
583
663
|
: null;
|
|
584
664
|
}
|
|
665
|
+
const explainers = normalizeExplainersConfig(parsed.explainers, 'local');
|
|
666
|
+
if (explainers) {
|
|
667
|
+
next.explainers = explainers;
|
|
668
|
+
}
|
|
585
669
|
const workflow = normalizeWorkflowConfig(parsed.workflow);
|
|
586
670
|
if (workflow) {
|
|
587
671
|
next.workflow = workflow;
|
|
@@ -721,6 +805,10 @@ function normalizeUserConfig(parsed) {
|
|
|
721
805
|
if (typeof parsed.updateNotifications === 'boolean') {
|
|
722
806
|
next.updateNotifications = parsed.updateNotifications;
|
|
723
807
|
}
|
|
808
|
+
const explainers = normalizeExplainersConfig(parsed.explainers, 'user');
|
|
809
|
+
if (explainers) {
|
|
810
|
+
next.explainers = explainers;
|
|
811
|
+
}
|
|
724
812
|
const workflow = normalizeWorkflowConfig(parsed.workflow);
|
|
725
813
|
if (workflow) {
|
|
726
814
|
next.workflow = workflow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kCAAkC;IACjD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kCAAkC;IACjD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AAwGD,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,CAAC,kCAAkC,CAAM,GAC1D,OAAO,CAAC,cAAc,CAAC,CAgFzB;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,MAAM,GAChB,UAAU,GAAG,IAAI,CAcnB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAY5B;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAoDxC"}
|