@absolutejs/artifacts 0.1.5 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -0
- package/dist/drizzle.js +24 -13
- package/dist/index.js +267 -24
- package/dist/manifest.js +227 -226
- package/dist/manifest.json +23 -23
- package/dist/rag.js +2 -2
- package/dist/src/index.d.ts +1 -1
- package/dist/src/manifest.d.ts +11 -1
- package/dist/src/registry.d.ts +1 -1
- package/dist/src/service.d.ts +5 -1
- package/dist/src/standardKinds.d.ts +45 -44
- package/dist/src/store.d.ts +5 -0
- package/dist/src/tools.d.ts +1 -1
- package/dist/src/types.d.ts +81 -1
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -24,6 +24,7 @@ routes, authorization, UI, or hosting.
|
|
|
24
24
|
datasets, code, images, audio, video, email, archives, and generic files
|
|
25
25
|
- An optional bridge to `@absolutejs/rag` ingestion
|
|
26
26
|
- Provider-neutral generation registries with atomic multi-file bundles
|
|
27
|
+
- Staged, validate-before-commit multi-artifact batches with completion receipts
|
|
27
28
|
- Revision-pinned or explicitly live publications
|
|
28
29
|
- Durable lifecycle events designed for transactional outboxes
|
|
29
30
|
- Per-revision RAG indexing state and an indexing coordinator
|
|
@@ -169,6 +170,45 @@ const report = await artifacts.createBundle("owner-123", {
|
|
|
169
170
|
});
|
|
170
171
|
```
|
|
171
172
|
|
|
173
|
+
When one job must produce several artifacts together, stage the complete batch,
|
|
174
|
+
run domain validators before persistence, and commit it through a store that
|
|
175
|
+
implements `createBatch` (the package Drizzle and memory stores do):
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
const staged = await artifacts.stageBatch(
|
|
179
|
+
"owner-123",
|
|
180
|
+
{
|
|
181
|
+
evidence: [{ sourceId: "research-run-123", sourceUrl: sourceUrl }],
|
|
182
|
+
items: [
|
|
183
|
+
{ artifact: worksheetInput, key: "worksheet" },
|
|
184
|
+
{ artifact: reportInput, key: "report" },
|
|
185
|
+
],
|
|
186
|
+
provenance: { tool: "prospecting_mission", traceId: mission.id },
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
validators: [
|
|
190
|
+
({ items }) =>
|
|
191
|
+
validateDomainEvidence(items).map((message) => ({
|
|
192
|
+
code: "evidence_invalid",
|
|
193
|
+
message,
|
|
194
|
+
})),
|
|
195
|
+
],
|
|
196
|
+
},
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
const receipt = await staged.commit();
|
|
200
|
+
if (receipt.status !== "committed") throw new Error(receipt.error);
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Every artifact carries its batch id, item key, evidence, and provenance.
|
|
204
|
+
`commit()` returns the durable reconciliation receipt: artifact ids,
|
|
205
|
+
revisions, atomicity, validation outcome, and any archived compensation. The
|
|
206
|
+
default mode requires an atomic `ArtifactStore.createBatch`. Hosts that cannot
|
|
207
|
+
provide a transaction may explicitly select `archive_on_failure`; completed
|
|
208
|
+
earlier writes are then archived and reported as `rolled_back` or
|
|
209
|
+
`partial_failure`. Calling `rollback()` before commit releases all staged
|
|
210
|
+
asset transactions.
|
|
211
|
+
|
|
172
212
|
## Generation
|
|
173
213
|
|
|
174
214
|
Generators are provider-neutral. They return validated structured content and
|
package/dist/drizzle.js
CHANGED
|
@@ -145,6 +145,17 @@ var createDrizzleArtifactStore = (options) => ({
|
|
|
145
145
|
if (events.length > 0)
|
|
146
146
|
await transaction.insert(artifactEvents).values(eventRows(events));
|
|
147
147
|
}),
|
|
148
|
+
createBatch: (entries) => options.db.transaction(async (transaction) => {
|
|
149
|
+
if (entries.length === 0)
|
|
150
|
+
return;
|
|
151
|
+
for (const { events: events2 = [], record } of entries)
|
|
152
|
+
assertEventsBelongToArtifact(record, events2);
|
|
153
|
+
await transaction.insert(artifactRecords).values(entries.map(({ record }) => recordRow(record)));
|
|
154
|
+
await transaction.insert(artifactRevisions).values(entries.map(({ record }) => revisionRow(record)));
|
|
155
|
+
const events = entries.flatMap((entry) => entry.events ?? []);
|
|
156
|
+
if (events.length > 0)
|
|
157
|
+
await transaction.insert(artifactEvents).values(eventRows(events));
|
|
158
|
+
}),
|
|
148
159
|
get: async (ownerId, artifactId) => {
|
|
149
160
|
const [row] = await options.db.select({ document: artifactRecords.document }).from(artifactRecords).where(and(eq(artifactRecords.id, artifactId), eq(artifactRecords.ownerId, ownerId))).limit(1);
|
|
150
161
|
return row?.document ?? null;
|
|
@@ -235,18 +246,18 @@ var createDrizzleArtifactStore = (options) => ({
|
|
|
235
246
|
})
|
|
236
247
|
});
|
|
237
248
|
export {
|
|
238
|
-
|
|
239
|
-
artifactRevisions,
|
|
240
|
-
artifactRecords,
|
|
241
|
-
artifactIndexingStates,
|
|
242
|
-
artifactEvents,
|
|
243
|
-
artifactDrizzleSchema,
|
|
244
|
-
ArtifactRevisionSelectSchema,
|
|
245
|
-
ArtifactRevisionInsertSchema,
|
|
246
|
-
ArtifactRecordSelectSchema,
|
|
247
|
-
ArtifactRecordInsertSchema,
|
|
248
|
-
ArtifactIndexingStateSelectSchema,
|
|
249
|
-
ArtifactIndexingStateInsertSchema,
|
|
249
|
+
ArtifactEventInsertSchema,
|
|
250
250
|
ArtifactEventSelectSchema,
|
|
251
|
-
|
|
251
|
+
ArtifactIndexingStateInsertSchema,
|
|
252
|
+
ArtifactIndexingStateSelectSchema,
|
|
253
|
+
ArtifactRecordInsertSchema,
|
|
254
|
+
ArtifactRecordSelectSchema,
|
|
255
|
+
ArtifactRevisionInsertSchema,
|
|
256
|
+
ArtifactRevisionSelectSchema,
|
|
257
|
+
artifactDrizzleSchema,
|
|
258
|
+
artifactEvents,
|
|
259
|
+
artifactIndexingStates,
|
|
260
|
+
artifactRecords,
|
|
261
|
+
artifactRevisions,
|
|
262
|
+
createDrizzleArtifactStore
|
|
252
263
|
};
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/registry.ts
|
|
3
|
-
import { Value } from "
|
|
3
|
+
import { Value } from "typebox/value";
|
|
4
4
|
|
|
5
5
|
// src/types.ts
|
|
6
6
|
var ARTIFACT_STATUSES = ["draft", "published", "archived"];
|
|
@@ -49,7 +49,7 @@ var defineArtifactRegistry = (definitions) => ({
|
|
|
49
49
|
}
|
|
50
50
|
if (!Value.Check(definition.content, content) || !isJsonValue(content)) {
|
|
51
51
|
const issue = [...Value.Errors(definition.content, content)][0];
|
|
52
|
-
const detail = issue ? `${issue.
|
|
52
|
+
const detail = issue ? `${issue.instancePath || "/"}: ${issue.message}` : "invalid content";
|
|
53
53
|
throw new ArtifactError("invalid_content", `Invalid ${kind} artifact content (${detail})`);
|
|
54
54
|
}
|
|
55
55
|
return content;
|
|
@@ -88,7 +88,7 @@ var createArtifactGeneratorRegistry = (initial = []) => {
|
|
|
88
88
|
};
|
|
89
89
|
};
|
|
90
90
|
// src/standardKinds.ts
|
|
91
|
-
import { Type } from "
|
|
91
|
+
import { Type } from "typebox";
|
|
92
92
|
var FileArtifactContentSchema = Type.Object({
|
|
93
93
|
description: Type.Optional(Type.String()),
|
|
94
94
|
instructions: Type.Optional(Type.String()),
|
|
@@ -192,6 +192,7 @@ var createArtifactService = (options) => {
|
|
|
192
192
|
const now = () => (options.clock ?? (() => new Date))().toISOString();
|
|
193
193
|
const idFactory = options.idFactory ?? (() => crypto.randomUUID());
|
|
194
194
|
const eventIdFactory = options.eventIdFactory ?? (() => crypto.randomUUID());
|
|
195
|
+
const batchIdFactory = options.batchIdFactory ?? (() => crypto.randomUUID());
|
|
195
196
|
const event = (artifact, type, payload) => ({
|
|
196
197
|
artifactId: artifact.id,
|
|
197
198
|
createdAt: now(),
|
|
@@ -391,6 +392,231 @@ var createArtifactService = (options) => {
|
|
|
391
392
|
throw error;
|
|
392
393
|
}
|
|
393
394
|
},
|
|
395
|
+
stageBatch: async (ownerId, input, stageOptions = {}) => {
|
|
396
|
+
if (input.items.length === 0) {
|
|
397
|
+
throw new ArtifactError("invalid_content", "An artifact batch must contain at least one artifact");
|
|
398
|
+
}
|
|
399
|
+
const keys = input.items.map((item) => item.key.trim());
|
|
400
|
+
if (keys.some((key) => key.length === 0) || new Set(keys).size !== keys.length) {
|
|
401
|
+
throw new ArtifactError("invalid_content", "Artifact batch item keys must be non-empty and unique");
|
|
402
|
+
}
|
|
403
|
+
const bundleId = input.bundleId ?? batchIdFactory();
|
|
404
|
+
const stagedAt = now();
|
|
405
|
+
const sharedEvidence = input.evidence ?? [];
|
|
406
|
+
const staged = [];
|
|
407
|
+
const evidenceJson = (evidence) => evidence.map((reference) => ({
|
|
408
|
+
...reference.capturedAt ? { capturedAt: reference.capturedAt } : {},
|
|
409
|
+
...reference.excerpt ? { excerpt: reference.excerpt } : {},
|
|
410
|
+
...reference.metadata ? { metadata: reference.metadata } : {},
|
|
411
|
+
...reference.sourceId ? { sourceId: reference.sourceId } : {},
|
|
412
|
+
...reference.sourceUrl ? { sourceUrl: reference.sourceUrl } : {}
|
|
413
|
+
}));
|
|
414
|
+
try {
|
|
415
|
+
for (const [index, item] of input.items.entries()) {
|
|
416
|
+
const { assets: assetInputs = [], ...artifactInput } = item.artifact;
|
|
417
|
+
validateAssetInputs(item.artifact.kind, assetInputs);
|
|
418
|
+
const evidence = [...sharedEvidence, ...item.evidence ?? []];
|
|
419
|
+
const provisional = buildRecord(ownerId, {
|
|
420
|
+
...artifactInput,
|
|
421
|
+
metadata: {
|
|
422
|
+
...input.metadata,
|
|
423
|
+
...artifactInput.metadata,
|
|
424
|
+
artifactBatch: {
|
|
425
|
+
bundleId,
|
|
426
|
+
evidence: evidenceJson(evidence),
|
|
427
|
+
itemKey: item.key
|
|
428
|
+
}
|
|
429
|
+
},
|
|
430
|
+
provenance: {
|
|
431
|
+
...input.provenance,
|
|
432
|
+
...artifactInput.provenance,
|
|
433
|
+
evidence,
|
|
434
|
+
sourceIds: [
|
|
435
|
+
...new Set([
|
|
436
|
+
...input.provenance?.sourceIds ?? [],
|
|
437
|
+
...artifactInput.provenance?.sourceIds ?? [],
|
|
438
|
+
...evidence.flatMap((reference) => reference.sourceId ? [reference.sourceId] : [])
|
|
439
|
+
])
|
|
440
|
+
]
|
|
441
|
+
}
|
|
442
|
+
}, []);
|
|
443
|
+
if (assetInputs.length === 0) {
|
|
444
|
+
staged.push({ evidence, key: item.key, record: provisional });
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
const assetStore = requireAssetTransactions();
|
|
448
|
+
const transaction = await assetStore.stage(assetInputs, {
|
|
449
|
+
artifact: provisional,
|
|
450
|
+
idempotencyKey: `artifact-batch:${bundleId}:${index}`
|
|
451
|
+
});
|
|
452
|
+
staged.push({
|
|
453
|
+
evidence,
|
|
454
|
+
key: item.key,
|
|
455
|
+
record: {
|
|
456
|
+
...provisional,
|
|
457
|
+
assets: validateAssets(item.artifact.kind, transaction.references)
|
|
458
|
+
},
|
|
459
|
+
transaction
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
} catch (error) {
|
|
463
|
+
await Promise.allSettled(staged.map((item) => item.transaction?.rollback()));
|
|
464
|
+
throw error;
|
|
465
|
+
}
|
|
466
|
+
let validationIssues;
|
|
467
|
+
try {
|
|
468
|
+
validationIssues = (await Promise.all((stageOptions.validators ?? []).map((validate) => validate({
|
|
469
|
+
bundleId,
|
|
470
|
+
evidence: sharedEvidence,
|
|
471
|
+
items: staged,
|
|
472
|
+
ownerId
|
|
473
|
+
})))).flat();
|
|
474
|
+
} catch (error) {
|
|
475
|
+
await Promise.allSettled(staged.map((item) => item.transaction?.rollback()));
|
|
476
|
+
throw error;
|
|
477
|
+
}
|
|
478
|
+
const validation = validationIssues.length === 0 ? { valid: true } : { issues: validationIssues, valid: false };
|
|
479
|
+
let settled;
|
|
480
|
+
const receiptItems = () => staged.map(({ key, record }) => ({
|
|
481
|
+
artifactId: record.id,
|
|
482
|
+
key,
|
|
483
|
+
kind: record.kind,
|
|
484
|
+
revision: record.revision,
|
|
485
|
+
title: record.title
|
|
486
|
+
}));
|
|
487
|
+
const finish = (partial) => {
|
|
488
|
+
settled = {
|
|
489
|
+
bundleId,
|
|
490
|
+
completedAt: now(),
|
|
491
|
+
items: partial.items ?? receiptItems(),
|
|
492
|
+
ownerId,
|
|
493
|
+
stagedAt,
|
|
494
|
+
validation,
|
|
495
|
+
...partial
|
|
496
|
+
};
|
|
497
|
+
return settled;
|
|
498
|
+
};
|
|
499
|
+
const rollbackTransactions = async (candidates = staged) => {
|
|
500
|
+
const failures = [];
|
|
501
|
+
for (const item of candidates) {
|
|
502
|
+
if (!item.transaction)
|
|
503
|
+
continue;
|
|
504
|
+
try {
|
|
505
|
+
await item.transaction.rollback();
|
|
506
|
+
} catch {
|
|
507
|
+
failures.push(item.key);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
return failures;
|
|
511
|
+
};
|
|
512
|
+
if (!validation.valid) {
|
|
513
|
+
const failures = await rollbackTransactions();
|
|
514
|
+
finish({
|
|
515
|
+
archivedArtifactIds: [],
|
|
516
|
+
atomic: Boolean(options.store.createBatch),
|
|
517
|
+
error: failures.length === 0 ? "Artifact batch validation failed" : `Artifact batch validation failed; asset rollback failed for: ${failures.join(", ")}`,
|
|
518
|
+
status: failures.length === 0 ? "rolled_back" : "partial_failure"
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
return {
|
|
522
|
+
bundleId,
|
|
523
|
+
commit: async () => {
|
|
524
|
+
if (settled)
|
|
525
|
+
return settled;
|
|
526
|
+
const transactions = staged.flatMap((item) => item.transaction ? [item.transaction] : []);
|
|
527
|
+
const entries = staged.map(({ key, record }) => ({
|
|
528
|
+
events: [
|
|
529
|
+
event(record, "artifact.created", { bundleId, itemKey: key }),
|
|
530
|
+
event(record, "artifact.generated", { bundleId, itemKey: key })
|
|
531
|
+
],
|
|
532
|
+
record
|
|
533
|
+
}));
|
|
534
|
+
if (options.store.createBatch) {
|
|
535
|
+
try {
|
|
536
|
+
for (const transaction of transactions)
|
|
537
|
+
await transaction.commit();
|
|
538
|
+
await options.store.createBatch(entries);
|
|
539
|
+
return finish({
|
|
540
|
+
archivedArtifactIds: [],
|
|
541
|
+
atomic: true,
|
|
542
|
+
status: "committed"
|
|
543
|
+
});
|
|
544
|
+
} catch (error) {
|
|
545
|
+
const failures = await rollbackTransactions();
|
|
546
|
+
return finish({
|
|
547
|
+
archivedArtifactIds: [],
|
|
548
|
+
atomic: true,
|
|
549
|
+
error: error instanceof Error ? error.message : String(error),
|
|
550
|
+
status: failures.length === 0 ? "rolled_back" : "partial_failure"
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
if ((input.commitMode ?? "require_atomic") === "require_atomic") {
|
|
555
|
+
const failures = await rollbackTransactions();
|
|
556
|
+
return finish({
|
|
557
|
+
archivedArtifactIds: [],
|
|
558
|
+
atomic: false,
|
|
559
|
+
error: "The configured artifact store does not support atomic batches",
|
|
560
|
+
status: failures.length === 0 ? "rolled_back" : "partial_failure"
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
const created = [];
|
|
564
|
+
try {
|
|
565
|
+
for (const transaction of transactions)
|
|
566
|
+
await transaction.commit();
|
|
567
|
+
for (const [index, entry] of entries.entries()) {
|
|
568
|
+
await options.store.create(entry.record, entry.events);
|
|
569
|
+
created.push(staged[index]);
|
|
570
|
+
}
|
|
571
|
+
return finish({
|
|
572
|
+
archivedArtifactIds: [],
|
|
573
|
+
atomic: false,
|
|
574
|
+
status: "committed"
|
|
575
|
+
});
|
|
576
|
+
} catch (error) {
|
|
577
|
+
const archivedArtifactIds = [];
|
|
578
|
+
const archiveFailures = [];
|
|
579
|
+
for (const item of created) {
|
|
580
|
+
try {
|
|
581
|
+
await service.archive(ownerId, item.record.id);
|
|
582
|
+
archivedArtifactIds.push(item.record.id);
|
|
583
|
+
} catch {
|
|
584
|
+
archiveFailures.push(item.record.id);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
const uncreated = staged.filter((item) => !created.includes(item));
|
|
588
|
+
const rollbackFailures = await rollbackTransactions(uncreated);
|
|
589
|
+
const failed = [...archiveFailures, ...rollbackFailures];
|
|
590
|
+
return finish({
|
|
591
|
+
archivedArtifactIds,
|
|
592
|
+
atomic: false,
|
|
593
|
+
error: error instanceof Error ? error.message : String(error),
|
|
594
|
+
items: receiptItems().map((item) => ({
|
|
595
|
+
...item,
|
|
596
|
+
...archivedArtifactIds.includes(item.artifactId) ? { archived: true } : {}
|
|
597
|
+
})),
|
|
598
|
+
status: failed.length === 0 ? "rolled_back" : "partial_failure"
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
},
|
|
602
|
+
evidence: sharedEvidence,
|
|
603
|
+
items: staged,
|
|
604
|
+
ownerId,
|
|
605
|
+
rollback: async (reason = "Artifact batch rolled back before commit") => {
|
|
606
|
+
if (settled)
|
|
607
|
+
return settled;
|
|
608
|
+
const failures = await rollbackTransactions();
|
|
609
|
+
return finish({
|
|
610
|
+
archivedArtifactIds: [],
|
|
611
|
+
atomic: Boolean(options.store.createBatch),
|
|
612
|
+
error: failures.length === 0 ? reason : `${reason}; asset rollback failed for: ${failures.join(", ")}`,
|
|
613
|
+
status: failures.length === 0 ? "rolled_back" : "partial_failure"
|
|
614
|
+
});
|
|
615
|
+
},
|
|
616
|
+
stagedAt,
|
|
617
|
+
validation
|
|
618
|
+
};
|
|
619
|
+
},
|
|
394
620
|
detach: async (ownerId, artifactId, assetId, expectedRevision) => {
|
|
395
621
|
const current = await get(ownerId, artifactId);
|
|
396
622
|
requireCapability(current, "attach");
|
|
@@ -650,6 +876,21 @@ var createMemoryArtifactStore = (initial = []) => {
|
|
|
650
876
|
for (const event of newEvents)
|
|
651
877
|
events.set(event.id, clone(event));
|
|
652
878
|
},
|
|
879
|
+
createBatch: async (entries) => {
|
|
880
|
+
const ids = entries.map(({ record }) => record.id);
|
|
881
|
+
if (new Set(ids).size !== ids.length) {
|
|
882
|
+
throw new Error("Duplicate artifact id in batch");
|
|
883
|
+
}
|
|
884
|
+
const duplicate = ids.find((id) => records.has(id));
|
|
885
|
+
if (duplicate)
|
|
886
|
+
throw new Error(`Duplicate artifact id: ${duplicate}`);
|
|
887
|
+
for (const { events: newEvents = [], record } of entries) {
|
|
888
|
+
records.set(record.id, clone(record));
|
|
889
|
+
revisions.set(record.id, [clone(record)]);
|
|
890
|
+
for (const event of newEvents)
|
|
891
|
+
events.set(event.id, clone(event));
|
|
892
|
+
}
|
|
893
|
+
},
|
|
653
894
|
get: async (ownerId, artifactId) => {
|
|
654
895
|
const record = records.get(artifactId);
|
|
655
896
|
return record?.ownerId === ownerId ? clone(record) : null;
|
|
@@ -722,15 +963,17 @@ var createMemoryArtifactStore = (initial = []) => {
|
|
|
722
963
|
};
|
|
723
964
|
};
|
|
724
965
|
// src/tools.ts
|
|
725
|
-
import { Type as Type2 } from "
|
|
726
|
-
var JsonValueSchema = Type2.
|
|
727
|
-
Type2.
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
966
|
+
import { Type as Type2 } from "typebox";
|
|
967
|
+
var JsonValueSchema = Type2.Cyclic({
|
|
968
|
+
JsonValue: Type2.Union([
|
|
969
|
+
Type2.String(),
|
|
970
|
+
Type2.Number(),
|
|
971
|
+
Type2.Boolean(),
|
|
972
|
+
Type2.Null(),
|
|
973
|
+
Type2.Array(Type2.Ref("JsonValue")),
|
|
974
|
+
Type2.Record(Type2.String(), Type2.Ref("JsonValue"))
|
|
975
|
+
])
|
|
976
|
+
}, "JsonValue");
|
|
734
977
|
var record = (input) => isJsonValue(input) && input !== null && typeof input === "object" && !Array.isArray(input) ? input : {};
|
|
735
978
|
var stringValue = (input, key) => typeof input[key] === "string" ? input[key] : undefined;
|
|
736
979
|
var createArtifactTools = (options) => ({
|
|
@@ -853,17 +1096,17 @@ var createArtifactTools = (options) => ({
|
|
|
853
1096
|
}
|
|
854
1097
|
});
|
|
855
1098
|
export {
|
|
856
|
-
|
|
857
|
-
isJsonValue,
|
|
858
|
-
defineArtifactRegistry,
|
|
859
|
-
createMemoryArtifactStore,
|
|
860
|
-
createMemoryArtifactAssetStore,
|
|
861
|
-
createArtifactTools,
|
|
862
|
-
createArtifactService,
|
|
863
|
-
createArtifactRendererRegistry,
|
|
864
|
-
createArtifactGeneratorRegistry,
|
|
865
|
-
STANDARD_ARTIFACT_KIND_NAMES,
|
|
866
|
-
ArtifactError,
|
|
1099
|
+
ARTIFACT_EVENT_TYPES,
|
|
867
1100
|
ARTIFACT_STATUSES,
|
|
868
|
-
|
|
1101
|
+
ArtifactError,
|
|
1102
|
+
STANDARD_ARTIFACT_KIND_NAMES,
|
|
1103
|
+
createArtifactGeneratorRegistry,
|
|
1104
|
+
createArtifactRendererRegistry,
|
|
1105
|
+
createArtifactService,
|
|
1106
|
+
createArtifactTools,
|
|
1107
|
+
createMemoryArtifactAssetStore,
|
|
1108
|
+
createMemoryArtifactStore,
|
|
1109
|
+
defineArtifactRegistry,
|
|
1110
|
+
isJsonValue,
|
|
1111
|
+
standardArtifactDefinitions
|
|
869
1112
|
};
|