@highstate/backend 0.9.8 → 0.9.10
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/dist/{chunk-NMGIUI6X.js → chunk-DQDXRDUA.js} +228 -96
- package/dist/chunk-DQDXRDUA.js.map +1 -0
- package/dist/{chunk-EQ4LMS7B.js → chunk-WXDYCRTT.js} +1 -57
- package/dist/chunk-WXDYCRTT.js.map +1 -0
- package/dist/highstate.manifest.json +3 -3
- package/dist/index.js +117 -118
- package/dist/index.js.map +1 -1
- package/dist/library/worker/main.js +1 -1
- package/dist/shared/index.js +11 -13
- package/package.json +3 -3
- package/src/common/utils.ts +0 -74
- package/src/library/abstractions.ts +0 -5
- package/src/orchestrator/operation-workset.ts +64 -59
- package/src/orchestrator/operation.ts +3 -19
- package/src/project/manager.ts +66 -61
- package/src/shared/async-batcher.ts +73 -0
- package/src/shared/index.ts +1 -0
- package/src/shared/resolvers/graph-resolver.ts +146 -79
- package/src/shared/resolvers/input-hash.ts +22 -17
- package/src/shared/resolvers/input.ts +29 -26
- package/src/shared/resolvers/registry.ts +19 -9
- package/src/shared/resolvers/validation.ts +12 -18
- package/src/state/abstractions.ts +2 -3
- package/src/state/local.ts +13 -6
- package/src/terminal/manager.ts +2 -2
- package/dist/chunk-EQ4LMS7B.js.map +0 -1
- package/dist/chunk-NMGIUI6X.js.map +0 -1
@@ -317,75 +317,137 @@ function isFinalOperationStatus(status) {
|
|
317
317
|
|
318
318
|
// src/shared/resolvers/graph-resolver.ts
|
319
319
|
import { unique } from "remeda";
|
320
|
-
var
|
321
|
-
constructor(
|
322
|
-
|
323
|
-
this.
|
320
|
+
var GraphResolver = class {
|
321
|
+
constructor(nodes, logger, outputHandler) {
|
322
|
+
this.nodes = nodes;
|
323
|
+
this.logger = logger;
|
324
|
+
this.outputHandler = outputHandler;
|
324
325
|
}
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
}
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
}
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
326
|
+
workset = /* @__PURE__ */ new Set();
|
327
|
+
dependentMap = /* @__PURE__ */ new Map();
|
328
|
+
outputMap = /* @__PURE__ */ new Map();
|
329
|
+
addToWorkset(nodeId) {
|
330
|
+
this.workset.add(nodeId);
|
331
|
+
}
|
332
|
+
addAllNodesToWorkset() {
|
333
|
+
for (const nodeId of this.nodes.keys()) {
|
334
|
+
this.workset.add(nodeId);
|
335
|
+
}
|
336
|
+
}
|
337
|
+
/**
|
338
|
+
* The map of calculated outputs.
|
339
|
+
*/
|
340
|
+
get outputs() {
|
341
|
+
return this.outputMap;
|
342
|
+
}
|
343
|
+
requireOutput(nodeId) {
|
344
|
+
const output = this.outputMap.get(nodeId);
|
345
|
+
if (!output) {
|
346
|
+
throw new Error(`Output for node ${nodeId} is not available`);
|
347
|
+
}
|
348
|
+
return output;
|
349
|
+
}
|
350
|
+
/**
|
351
|
+
* Invalidates the node and all nodes that depend on it.
|
352
|
+
*
|
353
|
+
* Also adds the node to the work set for processing.
|
354
|
+
*/
|
355
|
+
invalidate(nodeId) {
|
356
|
+
const stack = [nodeId];
|
357
|
+
while (stack.length > 0) {
|
358
|
+
const nodeId2 = stack.pop();
|
359
|
+
if (!this.nodes.has(nodeId2)) {
|
360
|
+
continue;
|
361
|
+
}
|
362
|
+
this.outputMap.delete(nodeId2);
|
363
|
+
this.workset.add(nodeId2);
|
364
|
+
const dependents = this.dependentMap.get(nodeId2);
|
365
|
+
if (!dependents) {
|
366
|
+
continue;
|
367
|
+
}
|
368
|
+
for (const dependentId of dependents) {
|
369
|
+
if (this.outputMap.has(dependentId)) {
|
370
|
+
stack.push(dependentId);
|
357
371
|
}
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
372
|
+
}
|
373
|
+
this.dependentMap.delete(nodeId2);
|
374
|
+
}
|
375
|
+
}
|
376
|
+
/**
|
377
|
+
* Resolves all not-resolved or invalidated nodes in the graph.
|
378
|
+
*
|
379
|
+
* The abort signal of the previous operation must be called before calling this method again.
|
380
|
+
*/
|
381
|
+
async process(signal) {
|
382
|
+
while (this.workset.size > 0) {
|
383
|
+
const rootNodeId = this.workset.values().next().value;
|
384
|
+
const stack = [{ nodeId: rootNodeId, resolved: false, dependencies: [] }];
|
385
|
+
while (stack.length > 0) {
|
386
|
+
const stackItem = stack[stack.length - 1];
|
387
|
+
const { nodeId, resolved } = stackItem;
|
388
|
+
const node = this.nodes.get(nodeId);
|
389
|
+
if (!node) {
|
390
|
+
this.logger.warn({ nodeId }, "node not found in the graph, skipping");
|
391
|
+
stack.pop();
|
392
|
+
continue;
|
364
393
|
}
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
}
|
394
|
+
if (this.outputMap.has(nodeId)) {
|
395
|
+
stack.pop();
|
396
|
+
continue;
|
397
|
+
}
|
398
|
+
if (!resolved) {
|
399
|
+
stackItem.dependencies = unique(this.getNodeDependencies(node));
|
400
|
+
let hasUnresolvedDependencies = false;
|
401
|
+
for (const depId of stackItem.dependencies) {
|
402
|
+
if (!this.nodes.has(depId)) {
|
403
|
+
this.logger.warn({ depId, nodeId }, "dependency not found in the graph, skipping");
|
404
|
+
continue;
|
405
|
+
}
|
406
|
+
if (!this.outputMap.has(depId)) {
|
407
|
+
stack.push({ nodeId: depId, resolved: false, dependencies: [] });
|
408
|
+
hasUnresolvedDependencies = true;
|
409
|
+
}
|
410
|
+
}
|
411
|
+
if (hasUnresolvedDependencies) {
|
412
|
+
stackItem.resolved = true;
|
413
|
+
continue;
|
414
|
+
}
|
415
|
+
}
|
416
|
+
const output = await this.processNode(node, this.logger);
|
417
|
+
if (signal?.aborted) {
|
418
|
+
this.logger.warn({ nodeId }, "processing aborted, skipping output");
|
419
|
+
return;
|
420
|
+
}
|
421
|
+
for (const depId of stackItem.dependencies) {
|
422
|
+
let dependantSet = this.dependentMap.get(depId);
|
423
|
+
if (!dependantSet) {
|
424
|
+
dependantSet = /* @__PURE__ */ new Set();
|
425
|
+
this.dependentMap.set(depId, dependantSet);
|
426
|
+
}
|
427
|
+
dependantSet.add(nodeId);
|
428
|
+
}
|
429
|
+
this.outputMap.set(nodeId, output);
|
430
|
+
this.outputHandler?.(nodeId, output);
|
431
|
+
stack.pop();
|
432
|
+
}
|
433
|
+
this.workset.delete(rootNodeId);
|
434
|
+
}
|
435
|
+
}
|
436
|
+
};
|
375
437
|
|
376
438
|
// src/shared/resolvers/input.ts
|
377
439
|
import {
|
378
440
|
isUnitModel
|
379
441
|
} from "@highstate/contract";
|
380
442
|
import { fromEntries, mapValues } from "remeda";
|
381
|
-
var
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
}
|
443
|
+
var InputResolver = class extends GraphResolver {
|
444
|
+
// constructor(
|
445
|
+
// nodes: ReadonlyMap<string, InputResolverNode>,
|
446
|
+
// logger: Logger,
|
447
|
+
// outputHandler?: ResolverOutputHandler<InputResolverOutput>,
|
448
|
+
// ) {
|
449
|
+
// super(nodes, logger, outputHandler)
|
450
|
+
// }
|
389
451
|
getNodeDependencies(node) {
|
390
452
|
const dependencies = [];
|
391
453
|
if (node.kind === "hub") {
|
@@ -411,10 +473,10 @@ var createInputResolver = defineGraphResolver({
|
|
411
473
|
dependencies.push(`hub:${input.hubId}`);
|
412
474
|
}
|
413
475
|
return dependencies;
|
414
|
-
}
|
415
|
-
|
476
|
+
}
|
477
|
+
processNode(node) {
|
416
478
|
const getHubOutput = (input) => {
|
417
|
-
const output =
|
479
|
+
const output = this.outputs.get(`hub:${input.hubId}`);
|
418
480
|
if (!output) {
|
419
481
|
return { resolvedInputs: [] };
|
420
482
|
}
|
@@ -424,7 +486,7 @@ var createInputResolver = defineGraphResolver({
|
|
424
486
|
return output;
|
425
487
|
};
|
426
488
|
const getInstanceOutput = (input) => {
|
427
|
-
const output =
|
489
|
+
const output = this.outputs.get(`instance:${input.instanceId}`);
|
428
490
|
if (!output) {
|
429
491
|
return {
|
430
492
|
component: null,
|
@@ -450,7 +512,7 @@ var createInputResolver = defineGraphResolver({
|
|
450
512
|
const { component } = getInstanceOutput(input);
|
451
513
|
const componentInput = component?.outputs[input.output];
|
452
514
|
if (!componentInput) {
|
453
|
-
logger.warn({ msg: "output not found in the component", input, component });
|
515
|
+
this.logger.warn({ msg: "output not found in the component", input, component });
|
454
516
|
continue;
|
455
517
|
}
|
456
518
|
addHubResult({ input, type: componentInput.type });
|
@@ -469,11 +531,12 @@ var createInputResolver = defineGraphResolver({
|
|
469
531
|
if (node.instance.resolvedInputs) {
|
470
532
|
return {
|
471
533
|
kind: "instance",
|
534
|
+
instance: node.instance,
|
472
535
|
component: node.component,
|
473
536
|
resolvedInputs: mapValues(node.instance.resolvedInputs, (inputs, inputName) => {
|
474
537
|
const componentInput = node.component.inputs[inputName];
|
475
538
|
if (!componentInput) {
|
476
|
-
logger.warn({
|
539
|
+
this.logger.warn({
|
477
540
|
msg: "input not found in the component",
|
478
541
|
inputName,
|
479
542
|
component: node.component
|
@@ -499,12 +562,16 @@ var createInputResolver = defineGraphResolver({
|
|
499
562
|
const addInstanceInput = (inputName, input) => {
|
500
563
|
const componentInput = node.component.inputs[inputName];
|
501
564
|
if (!componentInput) {
|
502
|
-
logger.warn({
|
565
|
+
this.logger.warn({
|
566
|
+
msg: "input not found in the component",
|
567
|
+
input,
|
568
|
+
component: node.component
|
569
|
+
});
|
503
570
|
return;
|
504
571
|
}
|
505
572
|
const { component, resolvedOutputs } = getInstanceOutput(input);
|
506
573
|
if (!component) {
|
507
|
-
logger.warn({ instanceId: node.instance.id, input }, "no output found for the input");
|
574
|
+
this.logger.warn({ instanceId: node.instance.id, input }, "no output found for the input");
|
508
575
|
return;
|
509
576
|
}
|
510
577
|
if (isUnitModel(component)) {
|
@@ -559,6 +626,7 @@ var createInputResolver = defineGraphResolver({
|
|
559
626
|
);
|
560
627
|
return {
|
561
628
|
kind: "instance",
|
629
|
+
instance: node.instance,
|
562
630
|
component: node.component,
|
563
631
|
resolvedInputs,
|
564
632
|
resolvedOutputs: node.instance.resolvedOutputs,
|
@@ -566,7 +634,7 @@ var createInputResolver = defineGraphResolver({
|
|
566
634
|
matchedInjectionInputs: Array.from(matchedInjectionInputs.values())
|
567
635
|
};
|
568
636
|
}
|
569
|
-
}
|
637
|
+
};
|
570
638
|
function getResolvedHubInputs(output) {
|
571
639
|
if (output.kind !== "hub") {
|
572
640
|
throw new Error("Expected hub node");
|
@@ -593,10 +661,9 @@ function getMatchedInjectionInstanceInputs(output) {
|
|
593
661
|
}
|
594
662
|
|
595
663
|
// src/shared/resolvers/input-hash.ts
|
664
|
+
import { isUnitModel as isUnitModel2 } from "@highstate/contract";
|
596
665
|
import { sha256 } from "crypto-hash";
|
597
|
-
var
|
598
|
-
name: "input-hash-resolver",
|
599
|
-
getNodeId: (node) => node.instance.id,
|
666
|
+
var InputHashResolver = class extends GraphResolver {
|
600
667
|
getNodeDependencies({ resolvedInputs }) {
|
601
668
|
const dependencies = [];
|
602
669
|
for (const inputs of Object.values(resolvedInputs ?? {})) {
|
@@ -605,11 +672,22 @@ var createInputHashResolver = defineGraphResolver({
|
|
605
672
|
}
|
606
673
|
}
|
607
674
|
return dependencies;
|
608
|
-
}
|
609
|
-
async
|
675
|
+
}
|
676
|
+
async processNode({
|
677
|
+
instance,
|
678
|
+
component,
|
679
|
+
resolvedInputs,
|
680
|
+
sourceHash,
|
681
|
+
state
|
682
|
+
}) {
|
610
683
|
let sink = component.definitionHash + JSON.stringify(instance.args ?? {});
|
611
684
|
if (sourceHash) {
|
612
685
|
sink += sourceHash;
|
686
|
+
} else if (isUnitModel2(component)) {
|
687
|
+
this.logger.warn(
|
688
|
+
{ instanceId: instance.id },
|
689
|
+
"missing source hash for unit model, this may lead to incorrect input hash"
|
690
|
+
);
|
613
691
|
}
|
614
692
|
const sortedInputs = Object.entries(resolvedInputs).sort(([a], [b]) => a.localeCompare(b));
|
615
693
|
for (const [inputKey, inputs] of sortedInputs) {
|
@@ -620,7 +698,7 @@ var createInputHashResolver = defineGraphResolver({
|
|
620
698
|
const instanceIds = inputs.map((input) => input.input.instanceId);
|
621
699
|
instanceIds.sort();
|
622
700
|
for (const instanceId of instanceIds) {
|
623
|
-
const dependency =
|
701
|
+
const dependency = this.outputs.get(instanceId);
|
624
702
|
if (!dependency) continue;
|
625
703
|
sink += dependency.inputHash;
|
626
704
|
sink += dependency.outputHash;
|
@@ -631,13 +709,11 @@ var createInputHashResolver = defineGraphResolver({
|
|
631
709
|
outputHash: state?.outputHash ?? ""
|
632
710
|
};
|
633
711
|
}
|
634
|
-
}
|
712
|
+
};
|
635
713
|
|
636
714
|
// src/shared/resolvers/validation.ts
|
637
715
|
import { Ajv } from "ajv";
|
638
|
-
var
|
639
|
-
name: "validation-resolver",
|
640
|
-
getNodeId: (node) => node.instance.id,
|
716
|
+
var ValidationResolver = class extends GraphResolver {
|
641
717
|
getNodeDependencies({ resolvedInputs }) {
|
642
718
|
const dependencies = [];
|
643
719
|
for (const inputs of Object.values(resolvedInputs)) {
|
@@ -646,16 +722,16 @@ var createValidationResolver = defineGraphResolver({
|
|
646
722
|
}
|
647
723
|
}
|
648
724
|
return dependencies;
|
649
|
-
}
|
650
|
-
|
725
|
+
}
|
726
|
+
processNode({ instance, component, resolvedInputs }) {
|
651
727
|
const ajv = new Ajv({ strict: false });
|
652
|
-
logger.debug({ instanceId: instance.id }, "validating instance");
|
728
|
+
this.logger.debug({ instanceId: instance.id }, "validating instance");
|
653
729
|
for (const [name, argument] of Object.entries(component.args)) {
|
654
730
|
if (!argument.required && !instance.args?.[name]) {
|
655
731
|
continue;
|
656
732
|
}
|
657
733
|
if (!ajv.validate(argument.schema, instance.args?.[name])) {
|
658
|
-
logger.debug({ instanceId: instance.id, argumentName: name }, "invalid argument");
|
734
|
+
this.logger.debug({ instanceId: instance.id, argumentName: name }, "invalid argument");
|
659
735
|
return {
|
660
736
|
status: "invalid-args",
|
661
737
|
errorText: `invalid argument "${name}": ${ajv.errorsText()}`
|
@@ -664,7 +740,7 @@ var createValidationResolver = defineGraphResolver({
|
|
664
740
|
}
|
665
741
|
for (const inputs of Object.values(resolvedInputs)) {
|
666
742
|
for (const input of inputs) {
|
667
|
-
const inputInstance =
|
743
|
+
const inputInstance = this.outputs.get(input.input.instanceId);
|
668
744
|
if (inputInstance?.status !== "ok") {
|
669
745
|
return {
|
670
746
|
status: "invalid-inputs",
|
@@ -686,13 +762,13 @@ var createValidationResolver = defineGraphResolver({
|
|
686
762
|
}
|
687
763
|
return { status: "ok" };
|
688
764
|
}
|
689
|
-
}
|
765
|
+
};
|
690
766
|
|
691
767
|
// src/shared/resolvers/registry.ts
|
692
768
|
var resolverFactories = {
|
693
|
-
|
694
|
-
|
695
|
-
|
769
|
+
InputResolver,
|
770
|
+
InputHashResolver,
|
771
|
+
ValidationResolver
|
696
772
|
};
|
697
773
|
|
698
774
|
// src/shared/terminal.ts
|
@@ -751,6 +827,63 @@ function applyLibraryUpdate(components, entities, update) {
|
|
751
827
|
}
|
752
828
|
}
|
753
829
|
|
830
|
+
// src/shared/async-batcher.ts
|
831
|
+
function createAsyncBatcher(fn, { waitMs = 100, maxWaitTimeMs = 1e3 } = {}) {
|
832
|
+
let batch = [];
|
833
|
+
let activeTimeout = null;
|
834
|
+
let maxWaitTimeout = null;
|
835
|
+
let firstCallTimestamp = null;
|
836
|
+
async function processBatch() {
|
837
|
+
if (batch.length === 0) return;
|
838
|
+
const currentBatch = batch;
|
839
|
+
batch = [];
|
840
|
+
await fn(currentBatch);
|
841
|
+
if (maxWaitTimeout) {
|
842
|
+
clearTimeout(maxWaitTimeout);
|
843
|
+
maxWaitTimeout = null;
|
844
|
+
}
|
845
|
+
firstCallTimestamp = null;
|
846
|
+
}
|
847
|
+
function schedule() {
|
848
|
+
if (activeTimeout) clearTimeout(activeTimeout);
|
849
|
+
activeTimeout = setTimeout(() => {
|
850
|
+
activeTimeout = null;
|
851
|
+
void processBatch();
|
852
|
+
}, waitMs);
|
853
|
+
if (!firstCallTimestamp) {
|
854
|
+
firstCallTimestamp = Date.now();
|
855
|
+
maxWaitTimeout = setTimeout(() => {
|
856
|
+
if (activeTimeout) clearTimeout(activeTimeout);
|
857
|
+
activeTimeout = null;
|
858
|
+
void processBatch();
|
859
|
+
}, maxWaitTimeMs);
|
860
|
+
}
|
861
|
+
}
|
862
|
+
return {
|
863
|
+
/**
|
864
|
+
* Add an item to the batch.
|
865
|
+
*/
|
866
|
+
call(item) {
|
867
|
+
batch.push(item);
|
868
|
+
schedule();
|
869
|
+
},
|
870
|
+
/**
|
871
|
+
* Immediately flush the pending batch (if any).
|
872
|
+
*/
|
873
|
+
async flush() {
|
874
|
+
if (activeTimeout) {
|
875
|
+
clearTimeout(activeTimeout);
|
876
|
+
activeTimeout = null;
|
877
|
+
}
|
878
|
+
if (maxWaitTimeout) {
|
879
|
+
clearTimeout(maxWaitTimeout);
|
880
|
+
maxWaitTimeout = null;
|
881
|
+
}
|
882
|
+
await processBatch();
|
883
|
+
}
|
884
|
+
};
|
885
|
+
}
|
886
|
+
|
754
887
|
export {
|
755
888
|
positionSchema,
|
756
889
|
instanceInputSchema,
|
@@ -787,19 +920,18 @@ export {
|
|
787
920
|
projectOperationRequestSchema,
|
788
921
|
projectOperationSchema,
|
789
922
|
isFinalOperationStatus,
|
790
|
-
|
791
|
-
|
792
|
-
defineGraphResolver,
|
793
|
-
createInputResolver,
|
923
|
+
GraphResolver,
|
924
|
+
InputResolver,
|
794
925
|
getResolvedHubInputs,
|
795
926
|
getResolvedInstanceInputs,
|
796
927
|
getResolvedInjectionInstanceInputs,
|
797
928
|
getMatchedInjectionInstanceInputs,
|
798
|
-
|
799
|
-
|
929
|
+
InputHashResolver,
|
930
|
+
ValidationResolver,
|
800
931
|
resolverFactories,
|
801
932
|
terminalSessionSchema,
|
802
933
|
diffLibraries,
|
803
|
-
applyLibraryUpdate
|
934
|
+
applyLibraryUpdate,
|
935
|
+
createAsyncBatcher
|
804
936
|
};
|
805
|
-
//# sourceMappingURL=chunk-
|
937
|
+
//# sourceMappingURL=chunk-DQDXRDUA.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/shared/project.ts","../src/shared/state.ts","../src/shared/operation.ts","../src/shared/resolvers/graph-resolver.ts","../src/shared/resolvers/input.ts","../src/shared/resolvers/input-hash.ts","../src/shared/resolvers/validation.ts","../src/shared/resolvers/registry.ts","../src/shared/terminal.ts","../src/shared/library.ts","../src/shared/async-batcher.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport const positionSchema = z.object({\n x: z.number(),\n y: z.number(),\n})\n\nexport const instanceInputSchema = z.object({\n instanceId: z.string(),\n output: z.string(),\n})\n\nexport const hubInstanceInputSchema = z.object({\n hubId: z.string(),\n})\n\nexport const instanceModelPatchSchema = z.object({\n args: z.record(z.unknown()).optional(),\n inputs: z.record(z.array(instanceInputSchema)).optional(),\n hubInputs: z.record(z.array(hubInstanceInputSchema)).optional(),\n injectionInputs: z.array(hubInstanceInputSchema).optional(),\n position: positionSchema.optional(),\n})\n\nexport const instanceModelSchema = z.object({\n id: z.string(),\n type: z.string(),\n name: z.string(),\n\n ...instanceModelPatchSchema.shape,\n resolvedInputs: z.record(z.array(instanceInputSchema)).optional(),\n\n parentId: z.string().optional(),\n outputs: z.record(z.array(instanceInputSchema)).optional(),\n resolvedOutputs: z.record(z.array(instanceInputSchema)).optional(),\n})\n\nexport const compositeInstanceSchema = z.object({\n instance: instanceModelSchema,\n children: z.array(instanceModelSchema),\n inputHash: z.string().optional(),\n})\n\nexport type CompositeInstance = z.infer<typeof compositeInstanceSchema>\n\nexport const hubModelPatchSchema = z.object({\n position: positionSchema.optional(),\n inputs: z.array(instanceInputSchema).optional(),\n injectionInputs: z.array(hubInstanceInputSchema).optional(),\n})\n\nexport const hubModelSchema = z.object({\n id: z.string().nanoid(),\n position: positionSchema,\n\n inputs: z.array(instanceInputSchema).optional(),\n injectionInputs: z.array(hubInstanceInputSchema).optional(),\n})\n\nexport type InstanceModelPatch = z.infer<typeof instanceModelPatchSchema>\nexport type HubModel = z.infer<typeof hubModelSchema>\nexport type HubModelPatch = z.infer<typeof hubModelPatchSchema>\n","import { omit } from \"remeda\"\nimport { z } from \"zod\"\n\nexport const instanceStatusSchema = z.enum([\n \"not_created\",\n \"updating\",\n \"previewing\",\n \"destroying\",\n \"refreshing\",\n \"created\",\n \"error\",\n \"pending\",\n \"unknown\",\n])\n\nexport const instanceStatusFieldValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.array(z.string()),\n])\n\nexport const instanceStatusFieldSchema = z.object({\n name: z.string(),\n value: instanceStatusFieldValueSchema.optional(),\n displayName: z.string().optional(),\n sensitive: z.boolean().optional(),\n url: z.string().optional(),\n complementaryTo: z.string().optional(),\n})\n\nexport const instanceFileMetaSchema = z.object({\n name: z.string(),\n contentType: z.string(),\n size: z.number(),\n isBinary: z.boolean().optional(),\n})\n\nexport const instanceFileSchema = z.object({\n meta: instanceFileMetaSchema,\n content: z.string(),\n})\n\nexport const instancePageBlockSchema = z.union([\n z.object({\n type: z.literal(\"markdown\"),\n content: z.string(),\n }),\n z.object({\n type: z.literal(\"qr\"),\n content: z.string(),\n showContent: z.coerce.boolean(),\n language: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"file\"),\n fileMeta: instanceFileMetaSchema,\n }),\n])\n\nexport const instancePageMetaSchema = z.object({\n name: z.string(),\n title: z.string(),\n})\n\nexport const instancePageSchema = z.object({\n ...instancePageMetaSchema.shape,\n content: z.array(instancePageBlockSchema),\n})\n\nexport const instanceTerminalMetaSchema = z.object({\n name: z.string(),\n title: z.string(),\n description: z.string().optional(),\n})\n\nexport const instanceTerminalFileSchema = z.object({\n content: z.string().optional(),\n isBinary: z.boolean().optional(),\n mode: z.number().optional(),\n})\n\nexport const instanceTerminalSchema = z.object({\n ...instanceTerminalMetaSchema.shape,\n image: z.string(),\n command: z.string().array(),\n cwd: z.string().optional(),\n env: z.record(z.string()).optional(),\n files: z.record(instanceTerminalFileSchema).optional(),\n})\n\nexport const instanceTriggerSpecSchema = z.union([\n z.object({\n type: z.literal(\"before-destroy\"),\n }),\n z.object({\n type: z.literal(\"schedule\"),\n schedule: z.string(),\n }),\n])\n\nexport const instanceTriggerSchema = z.object({\n name: z.string(),\n title: z.string(),\n description: z.string().optional(),\n spec: instanceTriggerSpecSchema,\n})\n\nexport const instanceTriggerInvocationSchema = z.object({\n name: z.string(),\n})\n\nexport const instanceStateSchema = z.object({\n id: z.string(),\n parentId: z.string().nullable().default(null),\n status: instanceStatusSchema,\n dependencyIds: z.array(z.string()).default(() => []),\n\n latestOperationId: z.string().nullable().default(null),\n\n currentResourceCount: z.number().nullable().default(null),\n totalResourceCount: z.number().nullable().default(null),\n inputHash: z.string().nullable().default(null),\n outputHash: z.string().nullable().default(null),\n\n error: z.string().nullable().default(null),\n evaluationError: z.string().nullable().default(null),\n\n statusFields: z.array(instanceStatusFieldSchema).default(() => []),\n files: z.array(instanceFileMetaSchema).default(() => []),\n pages: z.array(instancePageMetaSchema).default(() => []),\n terminals: z.array(instanceTerminalMetaSchema).default(() => []),\n triggers: z.array(instanceTriggerSchema).default(() => []),\n})\n\nexport const instanceStateUpdateSchema = z\n .object({\n ...instanceStateSchema.shape,\n\n // secrets updated by the unit\n secrets: z.record(z.string()).nullable(),\n\n // log line emitted by the unit\n logLine: z.string().nullable(),\n })\n .partial()\n\nexport type InstanceStatusFieldValue = z.infer<typeof instanceStatusFieldValueSchema>\nexport type InstanceStatusField = z.infer<typeof instanceStatusFieldSchema>\nexport type InstanceTerminal = z.infer<typeof instanceTerminalSchema>\n\nexport type InstanceStatus = z.infer<typeof instanceStatusSchema>\nexport type InstanceState = z.infer<typeof instanceStateSchema>\n\nexport type InstanceStateUpdate = z.infer<typeof instanceStateUpdateSchema>\n\nexport type InstancePageBlock = z.infer<typeof instancePageBlockSchema>\nexport type InstancePageMeta = z.infer<typeof instancePageMetaSchema>\nexport type InstanceFileMeta = z.infer<typeof instanceFileMetaSchema>\n\nexport type InstanceTriggerSpec = z.infer<typeof instanceTriggerSpecSchema>\nexport type InstanceTrigger = z.infer<typeof instanceTriggerSchema>\nexport type InstanceTriggerInvocation = z.infer<typeof instanceTriggerInvocationSchema>\n\nexport function createInstanceState(\n id: string,\n status: InstanceStatus = \"not_created\",\n fields: Partial<InstanceState> = {},\n): InstanceState {\n return {\n id,\n parentId: null,\n dependencyIds: [],\n status: status,\n\n latestOperationId: null,\n\n currentResourceCount: null,\n totalResourceCount: null,\n inputHash: null,\n outputHash: null,\n\n error: null,\n evaluationError: null,\n\n statusFields: [],\n files: [],\n pages: [],\n terminals: [],\n triggers: [],\n\n ...fields,\n }\n}\n\nexport function applyPartialInstanceState(\n states: Map<string, InstanceState>,\n patch: Partial<InstanceState>,\n): InstanceState {\n if (!patch.id) {\n throw new Error(\"The ID of the instance state is required.\")\n }\n\n let state = states.get(patch.id) ?? createInstanceState(patch.id, \"unknown\")\n state = { ...state, ...patch }\n\n states.set(state.id, state)\n return state\n}\n\nexport function createInstanceStatePatch(update: InstanceStateUpdate): Partial<InstanceState> {\n return omit(update, [\"secrets\", \"logLine\"])\n}\n\n/**\n * Builds a map where instance id -> instance state ids that directly depend on the instance.\n *\n * @param instanceStates The instance states to build the map from.\n */\nexport function buildDependentInstanceStateMap(\n instanceStates: Map<string, InstanceState>,\n): Map<string, string[]> {\n const dependentMap = new Map<string, string[]>()\n\n for (const state of instanceStates.values()) {\n for (const dependency of state.dependencyIds) {\n let dependents = dependentMap.get(dependency)\n if (!dependents) {\n dependents = []\n dependentMap.set(dependency, dependents)\n }\n\n dependents.push(state.id)\n }\n }\n\n return dependentMap\n}\n\n/**\n * Gets all instance ids that depend on the given instance id (including recursively).\n * The instance id itself is not included in the result.\n *\n * @param dependentMap The dependent map.\n * @param instanceId The instance id to get all dependent instance ids.\n */\nexport function getAllDependentInstanceIds(\n dependentMap: Map<string, string[]>,\n instanceId: string,\n): string[] {\n const result = new Set<string>()\n const visited = new Set<string>()\n\n const traverse = (id: string) => {\n if (visited.has(id)) return\n visited.add(id)\n\n const dependents = dependentMap.get(id)\n if (!dependents) return\n\n for (const dependent of dependents) {\n result.add(dependent)\n traverse(dependent)\n }\n }\n\n traverse(instanceId)\n\n return Array.from(result)\n}\n","import { z } from \"zod\"\n\nexport const operationTypeSchema = z.enum([\"update\", \"preview\", \"destroy\", \"recreate\", \"refresh\"])\n\nexport const operationStatusSchema = z.enum([\n \"pending\",\n \"running\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n])\n\nexport const operationOptionsSchema = z.object({\n /**\n * Whether to force update all dependencies of the instances even if they are not changed.\n *\n * Only applicable for `update`, `preview`, `recreate`, and `refresh` operations.\n * By default, `false`.\n */\n forceUpdateDependencies: z.boolean().default(false),\n\n /**\n * Whether to force update all children of the composite instances even if they are not changed.\n *\n * Only applicable for `update`, `preview`, `recreate`, and `refresh` operations.\n * By default, `false`.\n */\n forceUpdateChildren: z.boolean().default(false),\n\n /**\n * Whether to destroy all dependents of the instances when destroying them.\n *\n * Only applicable for `destroy`.\n * By default, `true`.\n */\n destroyDependentInstances: z.boolean().default(true),\n\n /**\n * Whether to invoke destroy triggers when destroying the instances.\n *\n * Only applicable for `destroy`.\n * By default, `true`.\n */\n invokeDestroyTriggers: z.boolean().default(true),\n\n /**\n * Whether to delete unreachable resources when updating or destroying the instances.\n * This is potentially dangerous and should be used with caution.\n *\n * By default, `false`.\n */\n deleteUnreachableResources: z.boolean().default(false),\n\n /**\n * Whether to delete the stack state even if the destroy operation fails.\n * This is very dangerous and should be used only when the stack is unrecoverable.\n *\n * By default, `false`.\n */\n forceDeleteState: z.boolean().default(false),\n\n /**\n * Whether to refresh the state before running the operation.\n *\n * By default, `false`.\n */\n refresh: z.boolean().default(false),\n})\n\nexport const projectOperationRequestSchema = z.object({\n projectId: z.string(),\n type: operationTypeSchema,\n instanceIds: z.array(z.string()),\n options: operationOptionsSchema.partial().optional(),\n})\n\nexport const projectOperationSchema = z.object({\n id: z.string().uuid(),\n status: operationStatusSchema,\n\n projectId: z.string(),\n type: operationTypeSchema,\n\n requestedInstanceIds: z.array(z.string()),\n\n instanceIdsToUpdate: z.array(z.string()).default(() => []),\n instanceIdsToDestroy: z.array(z.string()).default(() => []),\n\n options: operationOptionsSchema.default(() => ({})),\n\n error: z.string().nullable(),\n startedAt: z.number(),\n completedAt: z.number().nullable(),\n})\n\nexport type OperationType = z.infer<typeof operationTypeSchema>\nexport type OperationStatus = z.infer<typeof operationStatusSchema>\nexport type ProjectOperation = z.infer<typeof projectOperationSchema>\nexport type ProjectOperationRequest = z.infer<typeof projectOperationRequestSchema>\nexport type OperationOptions = z.infer<typeof operationOptionsSchema>\n\nexport function isFinalOperationStatus(status: OperationStatus): boolean {\n return status === \"completed\" || status === \"failed\" || status === \"cancelled\"\n}\n","import type { Logger } from \"pino\"\nimport { unique } from \"remeda\"\n\nexport type ResolverOutputHandler<TOutput> = (id: string, value: TOutput) => void\n\nexport abstract class GraphResolver<TNode, TOutput> {\n private readonly workset: Set<string> = new Set()\n private readonly dependentMap: Map<string, Set<string>> = new Map()\n private readonly outputMap: Map<string, TOutput> = new Map()\n\n constructor(\n private readonly nodes: ReadonlyMap<string, TNode>,\n protected readonly logger: Logger,\n private readonly outputHandler?: ResolverOutputHandler<TOutput>,\n ) {}\n\n addToWorkset(nodeId: string): void {\n this.workset.add(nodeId)\n }\n\n addAllNodesToWorkset(): void {\n for (const nodeId of this.nodes.keys()) {\n this.workset.add(nodeId)\n }\n }\n\n /**\n * The map of calculated outputs.\n */\n get outputs(): ReadonlyMap<string, TOutput> {\n return this.outputMap\n }\n\n requireOutput(nodeId: string): TOutput {\n const output = this.outputMap.get(nodeId)\n if (!output) {\n throw new Error(`Output for node ${nodeId} is not available`)\n }\n\n return output\n }\n\n /**\n * Gets the list of the identifiers of the dependencies for the node.\n *\n * Used to produce the dependency graph.\n */\n protected abstract getNodeDependencies(node: TNode): string[]\n\n /**\n * Processes the node and returns the output.\n */\n protected abstract processNode(node: TNode, logger: Logger): TOutput | Promise<TOutput>\n\n /**\n * Invalidates the node and all nodes that depend on it.\n *\n * Also adds the node to the work set for processing.\n */\n invalidate(nodeId: string): void {\n const stack = [nodeId]\n\n while (stack.length > 0) {\n const nodeId = stack.pop()!\n if (!this.nodes.has(nodeId)) {\n // it is ok to invalidate deleted nodes\n continue\n }\n\n // remove the node from the output map\n this.outputMap.delete(nodeId)\n this.workset.add(nodeId)\n\n const dependents = this.dependentMap.get(nodeId)\n if (!dependents) {\n continue\n }\n\n for (const dependentId of dependents) {\n if (this.outputMap.has(dependentId)) {\n // add the dependent to the stack for further processing\n stack.push(dependentId)\n }\n }\n\n // clear the dependent map for the node\n this.dependentMap.delete(nodeId)\n }\n }\n\n /**\n * Resolves all not-resolved or invalidated nodes in the graph.\n *\n * The abort signal of the previous operation must be called before calling this method again.\n */\n async process(signal?: AbortSignal): Promise<void> {\n while (this.workset.size > 0) {\n const rootNodeId = this.workset.values().next().value!\n const stack = [{ nodeId: rootNodeId, resolved: false, dependencies: [] as string[] }]\n\n while (stack.length > 0) {\n const stackItem = stack[stack.length - 1]\n const { nodeId, resolved } = stackItem\n\n const node = this.nodes.get(nodeId)\n if (!node) {\n this.logger.warn({ nodeId }, \"node not found in the graph, skipping\")\n stack.pop()\n continue\n }\n\n if (this.outputMap.has(nodeId)) {\n // already processed\n stack.pop()\n continue\n }\n\n if (!resolved) {\n stackItem.dependencies = unique(this.getNodeDependencies(node))\n\n let hasUnresolvedDependencies = false\n\n for (const depId of stackItem.dependencies) {\n if (!this.nodes.has(depId)) {\n this.logger.warn({ depId, nodeId }, \"dependency not found in the graph, skipping\")\n continue\n }\n\n // if (stack.some(item => item.nodeId === depId)) {\n // this.logger.warn(\n // { depId, nodeId, stack },\n // \"dependency is already in the stack, looks like a circular dependency, skipping\",\n // )\n // continue\n // }\n\n if (!this.outputMap.has(depId)) {\n stack.push({ nodeId: depId, resolved: false, dependencies: [] })\n hasUnresolvedDependencies = true\n }\n }\n\n if (hasUnresolvedDependencies) {\n // wait for dependencies to be resolved\n stackItem.resolved = true\n continue\n }\n }\n\n // all dependencies are resolved, process the node\n const output = await this.processNode(node, this.logger)\n\n if (signal?.aborted) {\n this.logger.warn({ nodeId }, \"processing aborted, skipping output\")\n return\n }\n\n // update the dependent map\n for (const depId of stackItem.dependencies) {\n let dependantSet = this.dependentMap.get(depId)\n if (!dependantSet) {\n dependantSet = new Set()\n this.dependentMap.set(depId, dependantSet)\n }\n\n dependantSet.add(nodeId)\n }\n\n this.outputMap.set(nodeId, output)\n this.outputHandler?.(nodeId, output)\n\n stack.pop()\n }\n\n this.workset.delete(rootNodeId)\n }\n }\n}\n","import type { HubModel } from \"../project\"\nimport {\n isUnitModel,\n type ComponentModel,\n type HubInput,\n type InstanceInput,\n type InstanceModel,\n} from \"@highstate/contract\"\nimport { fromEntries, mapValues } from \"remeda\"\nimport { GraphResolver } from \"./graph-resolver\"\n\nexport type InputResolverNode =\n | {\n kind: \"instance\"\n instance: InstanceModel\n component: ComponentModel\n }\n | {\n kind: \"hub\"\n hub: HubModel\n }\n\nexport type ResolvedInstanceInput = {\n input: InstanceInput\n type: string\n}\n\nexport type InputResolverOutput =\n | {\n kind: \"instance\"\n instance: InstanceModel\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n resolvedOutputs: Record<string, InstanceInput[]> | undefined\n resolvedInjectionInputs: ResolvedInstanceInput[]\n matchedInjectionInputs: ResolvedInstanceInput[]\n }\n | {\n kind: \"hub\"\n resolvedInputs: ResolvedInstanceInput[]\n }\n\n/**\n * Resolves the all recursive instance and hub inputs based on its direct inputs and injected inputs.\n */\nexport class InputResolver extends GraphResolver<InputResolverNode, InputResolverOutput> {\n // constructor(\n // nodes: ReadonlyMap<string, InputResolverNode>,\n // logger: Logger,\n // outputHandler?: ResolverOutputHandler<InputResolverOutput>,\n // ) {\n // super(nodes, logger, outputHandler)\n // }\n\n getNodeDependencies(node: InputResolverNode): string[] {\n const dependencies: string[] = []\n\n if (node.kind === \"hub\") {\n for (const input of node.hub.inputs ?? []) {\n dependencies.push(`instance:${input.instanceId}`)\n }\n\n for (const input of node.hub.injectionInputs ?? []) {\n dependencies.push(`hub:${input.hubId}`)\n }\n\n return dependencies\n }\n\n for (const inputs of Object.values(node.instance.inputs ?? {})) {\n for (const input of inputs) {\n dependencies.push(`instance:${input.instanceId}`)\n }\n }\n\n for (const inputs of Object.values(node.instance.hubInputs ?? {})) {\n for (const input of inputs) {\n dependencies.push(`hub:${input.hubId}`)\n }\n }\n\n for (const input of node.instance.injectionInputs ?? []) {\n dependencies.push(`hub:${input.hubId}`)\n }\n\n return dependencies\n }\n\n processNode(node: InputResolverNode): InputResolverOutput {\n const getHubOutput = (input: HubInput) => {\n const output = this.outputs.get(`hub:${input.hubId}`)\n if (!output) {\n return { resolvedInputs: [] }\n }\n\n if (output.kind !== \"hub\") {\n throw new Error(\"Expected hub node\")\n }\n\n return output\n }\n\n const getInstanceOutput = (input: InstanceInput) => {\n const output = this.outputs.get(`instance:${input.instanceId}`)\n if (!output) {\n return {\n component: null,\n resolvedInputs: [] as ResolvedInstanceInput[],\n resolvedOutputs: [] as InstanceInput[],\n }\n }\n\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return {\n component: output.component,\n resolvedInputs: output.resolvedInputs[input.output] ?? [],\n resolvedOutputs: output.resolvedOutputs?.[input.output],\n }\n }\n\n // resolve inputs for hub\n if (node.kind === \"hub\") {\n const hubResult: Map<string, ResolvedInstanceInput> = new Map()\n\n const addHubResult = (input: ResolvedInstanceInput) => {\n hubResult.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n\n for (const input of node.hub.inputs ?? []) {\n const { component } = getInstanceOutput(input)\n const componentInput = component?.outputs[input.output]\n\n if (!componentInput) {\n this.logger.warn({ msg: \"output not found in the component\", input, component })\n continue\n }\n\n addHubResult({ input, type: componentInput.type })\n }\n\n for (const injectionInput of node.hub.injectionInputs ?? []) {\n const { resolvedInputs } = getHubOutput(injectionInput)\n\n for (const input of resolvedInputs) {\n addHubResult(input)\n }\n }\n\n return {\n kind: \"hub\",\n resolvedInputs: Array.from(hubResult.values()),\n }\n }\n\n // хуяк (which translates as \"lets reuse resolved inputs of level 2+ composite instances provided by the evaluator\")\n if (node.instance.resolvedInputs) {\n return {\n kind: \"instance\",\n instance: node.instance,\n component: node.component,\n resolvedInputs: mapValues(node.instance.resolvedInputs, (inputs, inputName) => {\n const componentInput = node.component.inputs[inputName]\n if (!componentInput) {\n this.logger.warn({\n msg: \"input not found in the component\",\n inputName,\n component: node.component,\n })\n return []\n }\n\n return inputs.map(input => ({ input, type: componentInput.type }))\n }),\n resolvedOutputs: node.instance.resolvedOutputs ?? {},\n resolvedInjectionInputs: [],\n matchedInjectionInputs: [],\n }\n }\n\n // resolve inputs for instance\n const resolvedInputsMap: Map<string, Map<string, ResolvedInstanceInput>> = new Map()\n\n const addInstanceResult = (inputName: string, input: ResolvedInstanceInput) => {\n let inputs = resolvedInputsMap.get(inputName)\n if (!inputs) {\n inputs = new Map()\n resolvedInputsMap.set(inputName, inputs)\n }\n\n inputs.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n\n const addInstanceInput = (inputName: string, input: InstanceInput) => {\n const componentInput = node.component.inputs[inputName]\n if (!componentInput) {\n this.logger.warn({\n msg: \"input not found in the component\",\n input,\n component: node.component,\n })\n return\n }\n\n const { component, resolvedOutputs } = getInstanceOutput(input)\n\n if (!component) {\n this.logger.warn({ instanceId: node.instance.id, input }, \"no output found for the input\")\n return\n }\n\n if (isUnitModel(component)) {\n addInstanceResult(inputName, { input, type: componentInput.type })\n return\n }\n\n if (resolvedOutputs) {\n for (const output of resolvedOutputs) {\n addInstanceResult(inputName, { input: output, type: componentInput.type })\n }\n } else {\n // if the instance is not evaluated, we a forced to use the input as is\n addInstanceResult(inputName, { input, type: componentInput.type })\n }\n }\n\n for (const [inputName, inputs] of Object.entries(node.instance.inputs ?? {})) {\n for (const input of inputs) {\n addInstanceInput(inputName, input)\n }\n }\n\n const injectionInputs: Map<string, ResolvedInstanceInput> = new Map()\n const matchedInjectionInputs: Map<string, ResolvedInstanceInput> = new Map()\n\n for (const injectionInput of node.instance.injectionInputs ?? []) {\n const { resolvedInputs } = getHubOutput(injectionInput)\n for (const input of resolvedInputs) {\n injectionInputs.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n }\n\n for (const [inputName, componentInput] of Object.entries(node.component.inputs ?? {})) {\n const allInputs = new Map<string, ResolvedInstanceInput>(injectionInputs)\n const hubInputs = node.instance.hubInputs?.[inputName] ?? []\n\n for (const hubInput of hubInputs) {\n const { resolvedInputs } = getHubOutput(hubInput)\n for (const input of resolvedInputs) {\n allInputs.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n }\n\n for (const input of allInputs.values()) {\n if (input.type === componentInput.type) {\n addInstanceInput(inputName, input.input)\n\n const key = `${input.input.instanceId}:${input.input.output}`\n if (injectionInputs.has(key)) {\n matchedInjectionInputs.set(key, input)\n }\n }\n }\n }\n\n const resolvedInputs = fromEntries(\n Array.from(resolvedInputsMap.entries()).map(([inputName, inputs]) => [\n inputName,\n Array.from(inputs.values()),\n ]),\n )\n\n return {\n kind: \"instance\",\n instance: node.instance,\n component: node.component,\n resolvedInputs,\n resolvedOutputs: node.instance.resolvedOutputs,\n resolvedInjectionInputs: Array.from(injectionInputs.values()),\n matchedInjectionInputs: Array.from(matchedInjectionInputs.values()),\n }\n }\n}\n\nexport function getResolvedHubInputs(output: InputResolverOutput): ResolvedInstanceInput[] {\n if (output.kind !== \"hub\") {\n throw new Error(\"Expected hub node\")\n }\n\n return output.resolvedInputs\n}\n\nexport function getResolvedInstanceInputs(\n output: InputResolverOutput,\n): Record<string, ResolvedInstanceInput[]> {\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return output.resolvedInputs\n}\n\nexport function getResolvedInjectionInstanceInputs(\n output: InputResolverOutput,\n): ResolvedInstanceInput[] {\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return output.resolvedInjectionInputs\n}\n\nexport function getMatchedInjectionInstanceInputs(\n output: InputResolverOutput,\n): ResolvedInstanceInput[] {\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return output.matchedInjectionInputs\n}\n","import type { InstanceState } from \"../state\"\nimport type { ResolvedInstanceInput } from \"./input\"\nimport { isUnitModel, type ComponentModel, type InstanceModel } from \"@highstate/contract\"\nimport { sha256 } from \"crypto-hash\"\nimport { GraphResolver } from \"./graph-resolver\"\n\nexport type InputHashNode = {\n instance: InstanceModel\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n state: InstanceState | undefined\n sourceHash: string | undefined\n}\n\nexport type InputHashOutput = {\n inputHash: string\n outputHash: string\n}\n\n/**\n * Resolves the hash of the instance based on its args, resolved input hashes, source hash, and the output hash.\n */\nexport class InputHashResolver extends GraphResolver<InputHashNode, InputHashOutput> {\n getNodeDependencies({ resolvedInputs }: InputHashNode): string[] {\n const dependencies: string[] = []\n\n for (const inputs of Object.values(resolvedInputs ?? {})) {\n for (const input of inputs) {\n dependencies.push(input.input.instanceId)\n }\n }\n\n return dependencies\n }\n\n async processNode({\n instance,\n component,\n resolvedInputs,\n sourceHash,\n state,\n }: InputHashNode): Promise<InputHashOutput> {\n let sink = component.definitionHash + JSON.stringify(instance.args ?? {})\n\n if (sourceHash) {\n sink += sourceHash\n } else if (isUnitModel(component)) {\n this.logger.warn(\n { instanceId: instance.id },\n \"missing source hash for unit model, this may lead to incorrect input hash\",\n )\n }\n\n const sortedInputs = Object.entries(resolvedInputs)\n //\n .sort(([a], [b]) => a.localeCompare(b))\n\n for (const [inputKey, inputs] of sortedInputs) {\n if (Object.keys(inputs).length === 0) {\n continue\n }\n\n sink += inputKey\n\n const instanceIds = inputs.map(input => input.input.instanceId)\n instanceIds.sort()\n\n for (const instanceId of instanceIds) {\n const dependency = this.outputs.get(instanceId)\n if (!dependency) continue\n\n sink += dependency.inputHash\n sink += dependency.outputHash\n }\n }\n\n return {\n inputHash: await sha256(sink),\n outputHash: state?.outputHash ?? \"\",\n }\n }\n}\n","import type { ComponentModel, InstanceModel } from \"@highstate/contract\"\nimport type { ResolvedInstanceInput } from \"./input\"\nimport { Ajv } from \"ajv\"\nimport { GraphResolver } from \"./graph-resolver\"\n\nexport type ValidationNode = {\n instance: InstanceModel\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n}\n\nexport type ValidationOutput =\n | {\n status: \"ok\"\n }\n | {\n status: \"invalid-args\"\n errorText: string\n }\n | {\n status: \"invalid-inputs\" | \"missing-inputs\"\n errorText: string\n }\n\n/**\n * Validates the instance based on its arguments and inputs.\n */\nexport class ValidationResolver extends GraphResolver<ValidationNode, ValidationOutput> {\n getNodeDependencies({ resolvedInputs }: ValidationNode): string[] {\n const dependencies: string[] = []\n\n for (const inputs of Object.values(resolvedInputs)) {\n for (const input of inputs) {\n dependencies.push(input.input.instanceId)\n }\n }\n\n return dependencies\n }\n\n processNode({ instance, component, resolvedInputs }: ValidationNode): ValidationOutput {\n const ajv = new Ajv({ strict: false })\n\n this.logger.debug({ instanceId: instance.id }, \"validating instance\")\n\n for (const [name, argument] of Object.entries(component.args)) {\n if (!argument.required && !instance.args?.[name]) {\n continue\n }\n\n if (!ajv.validate(argument.schema, instance.args?.[name])) {\n this.logger.debug({ instanceId: instance.id, argumentName: name }, \"invalid argument\")\n\n return {\n status: \"invalid-args\",\n errorText: `invalid argument \"${name}\": ${ajv.errorsText()}`,\n }\n }\n }\n\n for (const inputs of Object.values(resolvedInputs)) {\n for (const input of inputs) {\n const inputInstance = this.outputs.get(input.input.instanceId)\n if (inputInstance?.status !== \"ok\") {\n return {\n status: \"invalid-inputs\",\n errorText: `instance \"${input.input.instanceId}\" has errors`,\n }\n }\n }\n }\n\n for (const [name, input] of Object.entries(component.inputs)) {\n if (!input.required) {\n continue\n }\n\n if (!resolvedInputs[name] || !resolvedInputs[name].length) {\n return {\n status: \"missing-inputs\",\n errorText: `input \"${name}\" is missing`,\n }\n }\n }\n\n return { status: \"ok\" }\n }\n}\n","import type { Logger } from \"pino\"\nimport type { GraphResolver, ResolverOutputHandler } from \"./graph-resolver\"\nimport { InputResolver } from \"./input\"\nimport { InputHashResolver } from \"./input-hash\"\nimport { ValidationResolver } from \"./validation\"\n\nexport type GraphResolverType = \"InputResolver\" | \"InputHashResolver\" | \"ValidationResolver\"\n\nexport const resolverFactories = {\n InputResolver,\n InputHashResolver,\n ValidationResolver,\n} as Record<\n GraphResolverType,\n new (\n nodes: ReadonlyMap<string, unknown>,\n logger: Logger,\n outputHandler?: ResolverOutputHandler<unknown>,\n ) => GraphResolver<unknown, unknown>\n>\n","import { z } from \"zod\"\n\nexport const terminalSessionSchema = z.object({\n id: z.string().nanoid(),\n projectId: z.string(),\n instanceId: z.string(),\n terminalName: z.string(),\n terminalTitle: z.string(),\n createdAt: z.coerce.date(),\n finishedAt: z.coerce.date().optional(),\n})\n\nexport type TerminalSession = z.infer<typeof terminalSessionSchema>\n","import type { ComponentModel, Entity } from \"@highstate/contract\"\n\nexport type LibraryModel = {\n components: Record<string, ComponentModel>\n entities: Record<string, Entity>\n}\n\nexport type LibraryUpdate =\n | {\n type: \"reload-started\" | \"reload-completed\"\n }\n | {\n type: \"component-updated\"\n component: ComponentModel\n }\n | {\n type: \"entity-updated\"\n entity: Entity\n }\n | {\n type: \"component-removed\"\n componentType: string\n }\n | {\n type: \"entity-removed\"\n entityType: string\n }\n\nexport function diffLibraries(oldLibrary: LibraryModel, newLibrary: LibraryModel): LibraryUpdate[] {\n const updates: LibraryUpdate[] = []\n\n for (const [componentType, newComponent] of Object.entries(newLibrary.components)) {\n const existingComponent = oldLibrary.components[componentType]\n if (existingComponent?.definitionHash !== newComponent.definitionHash) {\n updates.push({ type: \"component-updated\", component: newComponent })\n }\n }\n\n for (const componentType of Object.keys(oldLibrary.components)) {\n if (!newLibrary.components[componentType]) {\n updates.push({ type: \"component-removed\", componentType })\n }\n }\n\n for (const [entityType, newEntity] of Object.entries(newLibrary.entities)) {\n const existingEntity = oldLibrary.entities[entityType]\n if (existingEntity?.definitionHash !== newEntity.definitionHash) {\n updates.push({ type: \"entity-updated\", entity: newEntity })\n }\n }\n\n for (const entityType of Object.keys(oldLibrary.entities)) {\n if (!newLibrary.entities[entityType]) {\n updates.push({ type: \"entity-removed\", entityType })\n }\n }\n\n return updates\n}\n\nexport function applyLibraryUpdate(\n components: Record<string, ComponentModel>,\n entities: Record<string, Entity>,\n update: LibraryUpdate,\n): void {\n switch (update.type) {\n case \"component-updated\":\n components[update.component.type] = update.component\n break\n case \"entity-updated\":\n entities[update.entity.type] = update.entity\n break\n case \"component-removed\":\n delete components[update.componentType]\n break\n case \"entity-removed\":\n delete entities[update.entityType]\n break\n }\n}\n","export type AsyncBatcherOptions = {\n waitMs?: number\n maxWaitTimeMs?: number\n}\n\nexport function createAsyncBatcher<T>(\n fn: (items: T[]) => Promise<void> | void,\n { waitMs = 100, maxWaitTimeMs = 1000 }: AsyncBatcherOptions = {},\n) {\n let batch: T[] = []\n let activeTimeout: NodeJS.Timeout | null = null\n let maxWaitTimeout: NodeJS.Timeout | null = null\n let firstCallTimestamp: number | null = null\n\n async function processBatch() {\n if (batch.length === 0) return\n\n const currentBatch = batch\n batch = [] // Reset batch before async call\n\n await fn(currentBatch)\n\n // Clear max wait timer since batch has been processed\n if (maxWaitTimeout) {\n clearTimeout(maxWaitTimeout)\n maxWaitTimeout = null\n }\n firstCallTimestamp = null\n }\n\n function schedule() {\n if (activeTimeout) clearTimeout(activeTimeout)\n activeTimeout = setTimeout(() => {\n activeTimeout = null\n void processBatch()\n }, waitMs)\n\n // Ensure batch is executed within maxWaitTimeMs\n if (!firstCallTimestamp) {\n firstCallTimestamp = Date.now()\n maxWaitTimeout = setTimeout(() => {\n if (activeTimeout) clearTimeout(activeTimeout)\n activeTimeout = null\n void processBatch()\n }, maxWaitTimeMs)\n }\n }\n\n return {\n /**\n * Add an item to the batch.\n */\n call(item: T): void {\n batch.push(item)\n schedule()\n },\n\n /**\n * Immediately flush the pending batch (if any).\n */\n async flush(): Promise<void> {\n if (activeTimeout) {\n clearTimeout(activeTimeout)\n activeTimeout = null\n }\n if (maxWaitTimeout) {\n clearTimeout(maxWaitTimeout)\n maxWaitTimeout = null\n }\n await processBatch()\n },\n }\n}\n"],"mappings":"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","names":["z","z","nodeId","resolvedInputs","isUnitModel","isUnitModel","z"]}
|