@powerhousedao/codegen 6.2.2-dev.77 → 6.2.2-dev.78

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/index.mjs CHANGED
@@ -201,7 +201,7 @@ async function generateAll(project) {
201
201
  //#endregion
202
202
  //#region src/codegen/get-version.ts
203
203
  function getCodegenVersion() {
204
- return "6.2.2-dev.77";
204
+ return "6.2.2-dev.78";
205
205
  }
206
206
  //#endregion
207
207
  //#region src/codegen/kysely.ts
@@ -254,7 +254,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
254
254
  "manifest": {
255
255
  "name": "@powerhousedao/connect",
256
256
  "productName": "Powerhouse-Connect",
257
- "version": "6.2.2-dev.77",
257
+ "version": "6.2.2-dev.78",
258
258
  "description": "Powerhouse Connect",
259
259
  "main": "dist/index.html",
260
260
  "type": "module",
@@ -382,7 +382,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
382
382
  "manifest": {
383
383
  "name": "@powerhousedao/switchboard",
384
384
  "type": "module",
385
- "version": "6.2.2-dev.77",
385
+ "version": "6.2.2-dev.78",
386
386
  "main": "dist/index.mjs",
387
387
  "exports": {
388
388
  ".": {
@@ -483,7 +483,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
483
483
  "dir": "/home/runner/work/powerhouse/powerhouse/clis/ph-cli",
484
484
  "manifest": {
485
485
  "name": "@powerhousedao/ph-cli",
486
- "version": "6.2.2-dev.77",
486
+ "version": "6.2.2-dev.78",
487
487
  "description": "",
488
488
  "license": "AGPL-3.0-only",
489
489
  "type": "module",
@@ -551,7 +551,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
551
551
  "dir": "/home/runner/work/powerhouse/powerhouse/clis/ph-cmd",
552
552
  "manifest": {
553
553
  "name": "ph-cmd",
554
- "version": "6.2.2-dev.77",
554
+ "version": "6.2.2-dev.78",
555
555
  "description": "Powerhouse CLI — create Vetra projects, generate document models and editors, run local dev environments, and publish packages.",
556
556
  "license": "AGPL-3.0-only",
557
557
  "type": "module",
@@ -611,7 +611,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
611
611
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/browser",
612
612
  "manifest": {
613
613
  "name": "@powerhousedao/analytics-engine-browser",
614
- "version": "6.2.2-dev.77",
614
+ "version": "6.2.2-dev.78",
615
615
  "license": "AGPL-3.0-only",
616
616
  "repository": {
617
617
  "type": "git",
@@ -671,7 +671,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
671
671
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/core",
672
672
  "manifest": {
673
673
  "name": "@powerhousedao/analytics-engine-core",
674
- "version": "6.2.2-dev.77",
674
+ "version": "6.2.2-dev.78",
675
675
  "license": "AGPL-3.0-only",
676
676
  "repository": {
677
677
  "type": "git",
@@ -718,7 +718,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
718
718
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/graphql",
719
719
  "manifest": {
720
720
  "name": "@powerhousedao/analytics-engine-graphql",
721
- "version": "6.2.2-dev.77",
721
+ "version": "6.2.2-dev.78",
722
722
  "license": "AGPL-3.0-only",
723
723
  "repository": {
724
724
  "type": "git",
@@ -752,7 +752,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
752
752
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/knex",
753
753
  "manifest": {
754
754
  "name": "@powerhousedao/analytics-engine-knex",
755
- "version": "6.2.2-dev.77",
755
+ "version": "6.2.2-dev.78",
756
756
  "license": "AGPL-3.0-only",
757
757
  "repository": {
758
758
  "type": "git",
@@ -790,7 +790,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
790
790
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/pg",
791
791
  "manifest": {
792
792
  "name": "@powerhousedao/analytics-engine-pg",
793
- "version": "6.2.2-dev.77",
793
+ "version": "6.2.2-dev.78",
794
794
  "license": "AGPL-3.0-only",
795
795
  "repository": {
796
796
  "type": "git",
@@ -830,7 +830,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
830
830
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/builder-tools",
831
831
  "manifest": {
832
832
  "name": "@powerhousedao/builder-tools",
833
- "version": "6.2.2-dev.77",
833
+ "version": "6.2.2-dev.78",
834
834
  "type": "module",
835
835
  "license": "AGPL-3.0-only",
836
836
  "publishConfig": { "access": "public" },
@@ -905,7 +905,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
905
905
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/codegen",
906
906
  "manifest": {
907
907
  "name": "@powerhousedao/codegen",
908
- "version": "6.2.2-dev.77",
908
+ "version": "6.2.2-dev.78",
909
909
  "license": "AGPL-3.0-only",
910
910
  "private": false,
911
911
  "type": "module",
@@ -995,7 +995,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
995
995
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/common",
996
996
  "manifest": {
997
997
  "name": "@powerhousedao/common",
998
- "version": "6.2.2-dev.77",
998
+ "version": "6.2.2-dev.78",
999
999
  "license": "AGPL-3.0-only",
1000
1000
  "type": "module",
1001
1001
  "files": ["/dist"],
@@ -1062,7 +1062,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1062
1062
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/config",
1063
1063
  "manifest": {
1064
1064
  "name": "@powerhousedao/config",
1065
- "version": "6.2.2-dev.77",
1065
+ "version": "6.2.2-dev.78",
1066
1066
  "description": "",
1067
1067
  "license": "AGPL-3.0-only",
1068
1068
  "private": false,
@@ -1100,7 +1100,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1100
1100
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/design-system",
1101
1101
  "manifest": {
1102
1102
  "name": "@powerhousedao/design-system",
1103
- "version": "6.2.2-dev.77",
1103
+ "version": "6.2.2-dev.78",
1104
1104
  "description": "Powerhouse document-engineering design system — GraphQL scalar UI components for building consistent Powerhouse editors.",
1105
1105
  "files": ["dist", "theme.css"],
1106
1106
  "type": "module",
@@ -1270,7 +1270,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1270
1270
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/document-model",
1271
1271
  "manifest": {
1272
1272
  "name": "document-model",
1273
- "version": "6.2.2-dev.77",
1273
+ "version": "6.2.2-dev.78",
1274
1274
  "license": "AGPL-3.0-only",
1275
1275
  "private": false,
1276
1276
  "files": ["dist"],
@@ -1350,7 +1350,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1350
1350
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/opentelemetry-instrumentation-reactor",
1351
1351
  "manifest": {
1352
1352
  "name": "@powerhousedao/opentelemetry-instrumentation-reactor",
1353
- "version": "6.2.2-dev.77",
1353
+ "version": "6.2.2-dev.78",
1354
1354
  "description": "OpenTelemetry instrumentation for @powerhousedao/reactor",
1355
1355
  "type": "module",
1356
1356
  "sideEffects": false,
@@ -1388,7 +1388,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1388
1388
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/pglite-fs",
1389
1389
  "manifest": {
1390
1390
  "name": "@powerhousedao/pglite-fs",
1391
- "version": "6.2.2-dev.77",
1391
+ "version": "6.2.2-dev.78",
1392
1392
  "license": "AGPL-3.0-only",
1393
1393
  "type": "module",
1394
1394
  "repository": {
@@ -1423,7 +1423,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1423
1423
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/powerhouse-vetra-packages",
1424
1424
  "manifest": {
1425
1425
  "name": "@powerhousedao/powerhouse-vetra-packages",
1426
- "version": "6.2.2-dev.77",
1426
+ "version": "6.2.2-dev.78",
1427
1427
  "description": "",
1428
1428
  "keywords": [],
1429
1429
  "author": "",
@@ -1547,7 +1547,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1547
1547
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor",
1548
1548
  "manifest": {
1549
1549
  "name": "@powerhousedao/reactor",
1550
- "version": "6.2.2-dev.77",
1550
+ "version": "6.2.2-dev.78",
1551
1551
  "description": "Core Powerhouse reactor — stores documents, resolves conflicts, and reprocesses operation histories. Supports local, cloud, and decentralized storage backends.",
1552
1552
  "repository": {
1553
1553
  "url": "https://github.com/powerhouse-inc/powerhouse",
@@ -1588,6 +1588,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1588
1588
  "bench:records": "tsx bench/records/run-records.ts",
1589
1589
  "bench:records:verify": "tsx bench/records/run-records.ts verify",
1590
1590
  "bench:records:from-vitest": "tsx bench/records/run-from-vitest.ts",
1591
+ "bench:fix": "tsx bench/fix/run-fix.ts",
1591
1592
  "bench:ui": "node bench/ui/serve.mjs",
1592
1593
  "docker:up": "docker compose up -d",
1593
1594
  "docker:down": "docker compose down"
@@ -1635,7 +1636,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1635
1636
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-api",
1636
1637
  "manifest": {
1637
1638
  "name": "@powerhousedao/reactor-api",
1638
- "version": "6.2.2-dev.77",
1639
+ "version": "6.2.2-dev.78",
1639
1640
  "description": "GraphQL API layer for the Powerhouse reactor — auto-generated subgraphs per document model plus the core reactor subgraph for drive and document management.",
1640
1641
  "type": "module",
1641
1642
  "repository": {
@@ -1784,7 +1785,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1784
1785
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-attachments",
1785
1786
  "manifest": {
1786
1787
  "name": "@powerhousedao/reactor-attachments",
1787
- "version": "6.2.2-dev.77",
1788
+ "version": "6.2.2-dev.78",
1788
1789
  "license": "AGPL-3.0-only",
1789
1790
  "type": "module",
1790
1791
  "repository": {
@@ -1851,7 +1852,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
1851
1852
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-browser",
1852
1853
  "manifest": {
1853
1854
  "name": "@powerhousedao/reactor-browser",
1854
- "version": "6.2.2-dev.77",
1855
+ "version": "6.2.2-dev.78",
1855
1856
  "license": "AGPL-3.0-only",
1856
1857
  "type": "module",
1857
1858
  "repository": {
@@ -2001,7 +2002,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
2001
2002
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-drive",
2002
2003
  "manifest": {
2003
2004
  "name": "@powerhousedao/reactor-drive",
2004
- "version": "6.2.2-dev.77",
2005
+ "version": "6.2.2-dev.78",
2005
2006
  "license": "AGPL-3.0-only",
2006
2007
  "type": "module",
2007
2008
  "repository": {
@@ -2056,7 +2057,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
2056
2057
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-group",
2057
2058
  "manifest": {
2058
2059
  "name": "@powerhousedao/reactor-group",
2059
- "version": "6.2.2-dev.77",
2060
+ "version": "6.2.2-dev.78",
2060
2061
  "description": "Platform document model for groups of member addresses, referenced by { group } principals in the auth scope.",
2061
2062
  "keywords": [
2062
2063
  "powerhouse",
@@ -2121,7 +2122,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
2121
2122
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-hypercore",
2122
2123
  "manifest": {
2123
2124
  "name": "@powerhousedao/reactor-hypercore",
2124
- "version": "6.2.2-dev.77",
2125
+ "version": "6.2.2-dev.78",
2125
2126
  "description": "Hypercore-backed IOperationStore for the Powerhouse Reactor",
2126
2127
  "repository": {
2127
2128
  "url": "https://github.com/powerhouse-inc/powerhouse",
@@ -2164,7 +2165,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
2164
2165
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-mcp",
2165
2166
  "manifest": {
2166
2167
  "name": "@powerhousedao/reactor-mcp",
2167
- "version": "6.2.2-dev.77",
2168
+ "version": "6.2.2-dev.78",
2168
2169
  "description": "MCP server for the Powerhouse reactor — exposes document model operations and drive management to AI coding assistants via the Model Context Protocol.",
2169
2170
  "type": "module",
2170
2171
  "repository": {
@@ -2239,7 +2240,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
2239
2240
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/registry",
2240
2241
  "manifest": {
2241
2242
  "name": "@powerhousedao/registry",
2242
- "version": "6.2.2-dev.77",
2243
+ "version": "6.2.2-dev.78",
2243
2244
  "description": "Powerhouse package registry — resolves and manages document model package dependencies within the Powerhouse ecosystem.",
2244
2245
  "type": "module",
2245
2246
  "repository": {
@@ -2301,7 +2302,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
2301
2302
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/renown",
2302
2303
  "manifest": {
2303
2304
  "name": "@renown/sdk",
2304
- "version": "6.2.2-dev.77",
2305
+ "version": "6.2.2-dev.78",
2305
2306
  "description": "Renown SDK — wallet-based authentication and user identity management for Powerhouse React applications.",
2306
2307
  "license": "AGPL-3.0-only",
2307
2308
  "private": false,
@@ -2438,7 +2439,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
2438
2439
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/shared",
2439
2440
  "manifest": {
2440
2441
  "name": "@powerhousedao/shared",
2441
- "version": "6.2.2-dev.77",
2442
+ "version": "6.2.2-dev.78",
2442
2443
  "type": "module",
2443
2444
  "sideEffects": false,
2444
2445
  "publishConfig": { "access": "public" },
@@ -2612,7 +2613,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
2612
2613
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/vetra",
2613
2614
  "manifest": {
2614
2615
  "name": "@powerhousedao/vetra",
2615
- "version": "6.2.2-dev.77",
2616
+ "version": "6.2.2-dev.78",
2616
2617
  "license": "AGPL-3.0-only",
2617
2618
  "type": "module",
2618
2619
  "sideEffects": false,
@@ -3164,7 +3165,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3164
3165
  "manifest": {
3165
3166
  "name": "@powerhousedao/connect",
3166
3167
  "productName": "Powerhouse-Connect",
3167
- "version": "6.2.2-dev.77",
3168
+ "version": "6.2.2-dev.78",
3168
3169
  "description": "Powerhouse Connect",
3169
3170
  "main": "dist/index.html",
3170
3171
  "type": "module",
@@ -3292,7 +3293,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3292
3293
  "manifest": {
3293
3294
  "name": "@powerhousedao/switchboard",
3294
3295
  "type": "module",
3295
- "version": "6.2.2-dev.77",
3296
+ "version": "6.2.2-dev.78",
3296
3297
  "main": "dist/index.mjs",
3297
3298
  "exports": {
3298
3299
  ".": {
@@ -3393,7 +3394,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3393
3394
  "dir": "/home/runner/work/powerhouse/powerhouse/clis/ph-cli",
3394
3395
  "manifest": {
3395
3396
  "name": "@powerhousedao/ph-cli",
3396
- "version": "6.2.2-dev.77",
3397
+ "version": "6.2.2-dev.78",
3397
3398
  "description": "",
3398
3399
  "license": "AGPL-3.0-only",
3399
3400
  "type": "module",
@@ -3461,7 +3462,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3461
3462
  "dir": "/home/runner/work/powerhouse/powerhouse/clis/ph-cmd",
3462
3463
  "manifest": {
3463
3464
  "name": "ph-cmd",
3464
- "version": "6.2.2-dev.77",
3465
+ "version": "6.2.2-dev.78",
3465
3466
  "description": "Powerhouse CLI — create Vetra projects, generate document models and editors, run local dev environments, and publish packages.",
3466
3467
  "license": "AGPL-3.0-only",
3467
3468
  "type": "module",
@@ -3521,7 +3522,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3521
3522
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/browser",
3522
3523
  "manifest": {
3523
3524
  "name": "@powerhousedao/analytics-engine-browser",
3524
- "version": "6.2.2-dev.77",
3525
+ "version": "6.2.2-dev.78",
3525
3526
  "license": "AGPL-3.0-only",
3526
3527
  "repository": {
3527
3528
  "type": "git",
@@ -3581,7 +3582,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3581
3582
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/core",
3582
3583
  "manifest": {
3583
3584
  "name": "@powerhousedao/analytics-engine-core",
3584
- "version": "6.2.2-dev.77",
3585
+ "version": "6.2.2-dev.78",
3585
3586
  "license": "AGPL-3.0-only",
3586
3587
  "repository": {
3587
3588
  "type": "git",
@@ -3628,7 +3629,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3628
3629
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/graphql",
3629
3630
  "manifest": {
3630
3631
  "name": "@powerhousedao/analytics-engine-graphql",
3631
- "version": "6.2.2-dev.77",
3632
+ "version": "6.2.2-dev.78",
3632
3633
  "license": "AGPL-3.0-only",
3633
3634
  "repository": {
3634
3635
  "type": "git",
@@ -3662,7 +3663,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3662
3663
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/knex",
3663
3664
  "manifest": {
3664
3665
  "name": "@powerhousedao/analytics-engine-knex",
3665
- "version": "6.2.2-dev.77",
3666
+ "version": "6.2.2-dev.78",
3666
3667
  "license": "AGPL-3.0-only",
3667
3668
  "repository": {
3668
3669
  "type": "git",
@@ -3700,7 +3701,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3700
3701
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/pg",
3701
3702
  "manifest": {
3702
3703
  "name": "@powerhousedao/analytics-engine-pg",
3703
- "version": "6.2.2-dev.77",
3704
+ "version": "6.2.2-dev.78",
3704
3705
  "license": "AGPL-3.0-only",
3705
3706
  "repository": {
3706
3707
  "type": "git",
@@ -3740,7 +3741,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3740
3741
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/builder-tools",
3741
3742
  "manifest": {
3742
3743
  "name": "@powerhousedao/builder-tools",
3743
- "version": "6.2.2-dev.77",
3744
+ "version": "6.2.2-dev.78",
3744
3745
  "type": "module",
3745
3746
  "license": "AGPL-3.0-only",
3746
3747
  "publishConfig": { "access": "public" },
@@ -3815,7 +3816,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3815
3816
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/codegen",
3816
3817
  "manifest": {
3817
3818
  "name": "@powerhousedao/codegen",
3818
- "version": "6.2.2-dev.77",
3819
+ "version": "6.2.2-dev.78",
3819
3820
  "license": "AGPL-3.0-only",
3820
3821
  "private": false,
3821
3822
  "type": "module",
@@ -3905,7 +3906,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3905
3906
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/common",
3906
3907
  "manifest": {
3907
3908
  "name": "@powerhousedao/common",
3908
- "version": "6.2.2-dev.77",
3909
+ "version": "6.2.2-dev.78",
3909
3910
  "license": "AGPL-3.0-only",
3910
3911
  "type": "module",
3911
3912
  "files": ["/dist"],
@@ -3972,7 +3973,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
3972
3973
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/config",
3973
3974
  "manifest": {
3974
3975
  "name": "@powerhousedao/config",
3975
- "version": "6.2.2-dev.77",
3976
+ "version": "6.2.2-dev.78",
3976
3977
  "description": "",
3977
3978
  "license": "AGPL-3.0-only",
3978
3979
  "private": false,
@@ -4010,7 +4011,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4010
4011
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/design-system",
4011
4012
  "manifest": {
4012
4013
  "name": "@powerhousedao/design-system",
4013
- "version": "6.2.2-dev.77",
4014
+ "version": "6.2.2-dev.78",
4014
4015
  "description": "Powerhouse document-engineering design system — GraphQL scalar UI components for building consistent Powerhouse editors.",
4015
4016
  "files": ["dist", "theme.css"],
4016
4017
  "type": "module",
@@ -4180,7 +4181,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4180
4181
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/document-model",
4181
4182
  "manifest": {
4182
4183
  "name": "document-model",
4183
- "version": "6.2.2-dev.77",
4184
+ "version": "6.2.2-dev.78",
4184
4185
  "license": "AGPL-3.0-only",
4185
4186
  "private": false,
4186
4187
  "files": ["dist"],
@@ -4260,7 +4261,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4260
4261
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/opentelemetry-instrumentation-reactor",
4261
4262
  "manifest": {
4262
4263
  "name": "@powerhousedao/opentelemetry-instrumentation-reactor",
4263
- "version": "6.2.2-dev.77",
4264
+ "version": "6.2.2-dev.78",
4264
4265
  "description": "OpenTelemetry instrumentation for @powerhousedao/reactor",
4265
4266
  "type": "module",
4266
4267
  "sideEffects": false,
@@ -4298,7 +4299,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4298
4299
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/pglite-fs",
4299
4300
  "manifest": {
4300
4301
  "name": "@powerhousedao/pglite-fs",
4301
- "version": "6.2.2-dev.77",
4302
+ "version": "6.2.2-dev.78",
4302
4303
  "license": "AGPL-3.0-only",
4303
4304
  "type": "module",
4304
4305
  "repository": {
@@ -4333,7 +4334,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4333
4334
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/powerhouse-vetra-packages",
4334
4335
  "manifest": {
4335
4336
  "name": "@powerhousedao/powerhouse-vetra-packages",
4336
- "version": "6.2.2-dev.77",
4337
+ "version": "6.2.2-dev.78",
4337
4338
  "description": "",
4338
4339
  "keywords": [],
4339
4340
  "author": "",
@@ -4457,7 +4458,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4457
4458
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor",
4458
4459
  "manifest": {
4459
4460
  "name": "@powerhousedao/reactor",
4460
- "version": "6.2.2-dev.77",
4461
+ "version": "6.2.2-dev.78",
4461
4462
  "description": "Core Powerhouse reactor — stores documents, resolves conflicts, and reprocesses operation histories. Supports local, cloud, and decentralized storage backends.",
4462
4463
  "repository": {
4463
4464
  "url": "https://github.com/powerhouse-inc/powerhouse",
@@ -4498,6 +4499,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4498
4499
  "bench:records": "tsx bench/records/run-records.ts",
4499
4500
  "bench:records:verify": "tsx bench/records/run-records.ts verify",
4500
4501
  "bench:records:from-vitest": "tsx bench/records/run-from-vitest.ts",
4502
+ "bench:fix": "tsx bench/fix/run-fix.ts",
4501
4503
  "bench:ui": "node bench/ui/serve.mjs",
4502
4504
  "docker:up": "docker compose up -d",
4503
4505
  "docker:down": "docker compose down"
@@ -4545,7 +4547,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4545
4547
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-api",
4546
4548
  "manifest": {
4547
4549
  "name": "@powerhousedao/reactor-api",
4548
- "version": "6.2.2-dev.77",
4550
+ "version": "6.2.2-dev.78",
4549
4551
  "description": "GraphQL API layer for the Powerhouse reactor — auto-generated subgraphs per document model plus the core reactor subgraph for drive and document management.",
4550
4552
  "type": "module",
4551
4553
  "repository": {
@@ -4694,7 +4696,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4694
4696
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-attachments",
4695
4697
  "manifest": {
4696
4698
  "name": "@powerhousedao/reactor-attachments",
4697
- "version": "6.2.2-dev.77",
4699
+ "version": "6.2.2-dev.78",
4698
4700
  "license": "AGPL-3.0-only",
4699
4701
  "type": "module",
4700
4702
  "repository": {
@@ -4761,7 +4763,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4761
4763
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-browser",
4762
4764
  "manifest": {
4763
4765
  "name": "@powerhousedao/reactor-browser",
4764
- "version": "6.2.2-dev.77",
4766
+ "version": "6.2.2-dev.78",
4765
4767
  "license": "AGPL-3.0-only",
4766
4768
  "type": "module",
4767
4769
  "repository": {
@@ -4911,7 +4913,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4911
4913
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-drive",
4912
4914
  "manifest": {
4913
4915
  "name": "@powerhousedao/reactor-drive",
4914
- "version": "6.2.2-dev.77",
4916
+ "version": "6.2.2-dev.78",
4915
4917
  "license": "AGPL-3.0-only",
4916
4918
  "type": "module",
4917
4919
  "repository": {
@@ -4966,7 +4968,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
4966
4968
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-group",
4967
4969
  "manifest": {
4968
4970
  "name": "@powerhousedao/reactor-group",
4969
- "version": "6.2.2-dev.77",
4971
+ "version": "6.2.2-dev.78",
4970
4972
  "description": "Platform document model for groups of member addresses, referenced by { group } principals in the auth scope.",
4971
4973
  "keywords": [
4972
4974
  "powerhouse",
@@ -5031,7 +5033,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
5031
5033
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-hypercore",
5032
5034
  "manifest": {
5033
5035
  "name": "@powerhousedao/reactor-hypercore",
5034
- "version": "6.2.2-dev.77",
5036
+ "version": "6.2.2-dev.78",
5035
5037
  "description": "Hypercore-backed IOperationStore for the Powerhouse Reactor",
5036
5038
  "repository": {
5037
5039
  "url": "https://github.com/powerhouse-inc/powerhouse",
@@ -5074,7 +5076,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
5074
5076
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-mcp",
5075
5077
  "manifest": {
5076
5078
  "name": "@powerhousedao/reactor-mcp",
5077
- "version": "6.2.2-dev.77",
5079
+ "version": "6.2.2-dev.78",
5078
5080
  "description": "MCP server for the Powerhouse reactor — exposes document model operations and drive management to AI coding assistants via the Model Context Protocol.",
5079
5081
  "type": "module",
5080
5082
  "repository": {
@@ -5149,7 +5151,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
5149
5151
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/registry",
5150
5152
  "manifest": {
5151
5153
  "name": "@powerhousedao/registry",
5152
- "version": "6.2.2-dev.77",
5154
+ "version": "6.2.2-dev.78",
5153
5155
  "description": "Powerhouse package registry — resolves and manages document model package dependencies within the Powerhouse ecosystem.",
5154
5156
  "type": "module",
5155
5157
  "repository": {
@@ -5211,7 +5213,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
5211
5213
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/renown",
5212
5214
  "manifest": {
5213
5215
  "name": "@renown/sdk",
5214
- "version": "6.2.2-dev.77",
5216
+ "version": "6.2.2-dev.78",
5215
5217
  "description": "Renown SDK — wallet-based authentication and user identity management for Powerhouse React applications.",
5216
5218
  "license": "AGPL-3.0-only",
5217
5219
  "private": false,
@@ -5348,7 +5350,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
5348
5350
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/shared",
5349
5351
  "manifest": {
5350
5352
  "name": "@powerhousedao/shared",
5351
- "version": "6.2.2-dev.77",
5353
+ "version": "6.2.2-dev.78",
5352
5354
  "type": "module",
5353
5355
  "sideEffects": false,
5354
5356
  "publishConfig": { "access": "public" },
@@ -5522,7 +5524,7 @@ async function getFullyQualifiedWorkspacePackageVersion(versionOrTag) {
5522
5524
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/vetra",
5523
5525
  "manifest": {
5524
5526
  "name": "@powerhousedao/vetra",
5525
- "version": "6.2.2-dev.77",
5527
+ "version": "6.2.2-dev.78",
5526
5528
  "license": "AGPL-3.0-only",
5527
5529
  "type": "module",
5528
5530
  "sideEffects": false,
@@ -6117,7 +6119,7 @@ async function migrate(version, projectDir = process.cwd()) {
6117
6119
  "manifest": {
6118
6120
  "name": "@powerhousedao/connect",
6119
6121
  "productName": "Powerhouse-Connect",
6120
- "version": "6.2.2-dev.77",
6122
+ "version": "6.2.2-dev.78",
6121
6123
  "description": "Powerhouse Connect",
6122
6124
  "main": "dist/index.html",
6123
6125
  "type": "module",
@@ -6245,7 +6247,7 @@ async function migrate(version, projectDir = process.cwd()) {
6245
6247
  "manifest": {
6246
6248
  "name": "@powerhousedao/switchboard",
6247
6249
  "type": "module",
6248
- "version": "6.2.2-dev.77",
6250
+ "version": "6.2.2-dev.78",
6249
6251
  "main": "dist/index.mjs",
6250
6252
  "exports": {
6251
6253
  ".": {
@@ -6346,7 +6348,7 @@ async function migrate(version, projectDir = process.cwd()) {
6346
6348
  "dir": "/home/runner/work/powerhouse/powerhouse/clis/ph-cli",
6347
6349
  "manifest": {
6348
6350
  "name": "@powerhousedao/ph-cli",
6349
- "version": "6.2.2-dev.77",
6351
+ "version": "6.2.2-dev.78",
6350
6352
  "description": "",
6351
6353
  "license": "AGPL-3.0-only",
6352
6354
  "type": "module",
@@ -6414,7 +6416,7 @@ async function migrate(version, projectDir = process.cwd()) {
6414
6416
  "dir": "/home/runner/work/powerhouse/powerhouse/clis/ph-cmd",
6415
6417
  "manifest": {
6416
6418
  "name": "ph-cmd",
6417
- "version": "6.2.2-dev.77",
6419
+ "version": "6.2.2-dev.78",
6418
6420
  "description": "Powerhouse CLI — create Vetra projects, generate document models and editors, run local dev environments, and publish packages.",
6419
6421
  "license": "AGPL-3.0-only",
6420
6422
  "type": "module",
@@ -6474,7 +6476,7 @@ async function migrate(version, projectDir = process.cwd()) {
6474
6476
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/browser",
6475
6477
  "manifest": {
6476
6478
  "name": "@powerhousedao/analytics-engine-browser",
6477
- "version": "6.2.2-dev.77",
6479
+ "version": "6.2.2-dev.78",
6478
6480
  "license": "AGPL-3.0-only",
6479
6481
  "repository": {
6480
6482
  "type": "git",
@@ -6534,7 +6536,7 @@ async function migrate(version, projectDir = process.cwd()) {
6534
6536
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/core",
6535
6537
  "manifest": {
6536
6538
  "name": "@powerhousedao/analytics-engine-core",
6537
- "version": "6.2.2-dev.77",
6539
+ "version": "6.2.2-dev.78",
6538
6540
  "license": "AGPL-3.0-only",
6539
6541
  "repository": {
6540
6542
  "type": "git",
@@ -6581,7 +6583,7 @@ async function migrate(version, projectDir = process.cwd()) {
6581
6583
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/graphql",
6582
6584
  "manifest": {
6583
6585
  "name": "@powerhousedao/analytics-engine-graphql",
6584
- "version": "6.2.2-dev.77",
6586
+ "version": "6.2.2-dev.78",
6585
6587
  "license": "AGPL-3.0-only",
6586
6588
  "repository": {
6587
6589
  "type": "git",
@@ -6615,7 +6617,7 @@ async function migrate(version, projectDir = process.cwd()) {
6615
6617
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/knex",
6616
6618
  "manifest": {
6617
6619
  "name": "@powerhousedao/analytics-engine-knex",
6618
- "version": "6.2.2-dev.77",
6620
+ "version": "6.2.2-dev.78",
6619
6621
  "license": "AGPL-3.0-only",
6620
6622
  "repository": {
6621
6623
  "type": "git",
@@ -6653,7 +6655,7 @@ async function migrate(version, projectDir = process.cwd()) {
6653
6655
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/analytics-engine/pg",
6654
6656
  "manifest": {
6655
6657
  "name": "@powerhousedao/analytics-engine-pg",
6656
- "version": "6.2.2-dev.77",
6658
+ "version": "6.2.2-dev.78",
6657
6659
  "license": "AGPL-3.0-only",
6658
6660
  "repository": {
6659
6661
  "type": "git",
@@ -6693,7 +6695,7 @@ async function migrate(version, projectDir = process.cwd()) {
6693
6695
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/builder-tools",
6694
6696
  "manifest": {
6695
6697
  "name": "@powerhousedao/builder-tools",
6696
- "version": "6.2.2-dev.77",
6698
+ "version": "6.2.2-dev.78",
6697
6699
  "type": "module",
6698
6700
  "license": "AGPL-3.0-only",
6699
6701
  "publishConfig": { "access": "public" },
@@ -6768,7 +6770,7 @@ async function migrate(version, projectDir = process.cwd()) {
6768
6770
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/codegen",
6769
6771
  "manifest": {
6770
6772
  "name": "@powerhousedao/codegen",
6771
- "version": "6.2.2-dev.77",
6773
+ "version": "6.2.2-dev.78",
6772
6774
  "license": "AGPL-3.0-only",
6773
6775
  "private": false,
6774
6776
  "type": "module",
@@ -6858,7 +6860,7 @@ async function migrate(version, projectDir = process.cwd()) {
6858
6860
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/common",
6859
6861
  "manifest": {
6860
6862
  "name": "@powerhousedao/common",
6861
- "version": "6.2.2-dev.77",
6863
+ "version": "6.2.2-dev.78",
6862
6864
  "license": "AGPL-3.0-only",
6863
6865
  "type": "module",
6864
6866
  "files": ["/dist"],
@@ -6925,7 +6927,7 @@ async function migrate(version, projectDir = process.cwd()) {
6925
6927
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/config",
6926
6928
  "manifest": {
6927
6929
  "name": "@powerhousedao/config",
6928
- "version": "6.2.2-dev.77",
6930
+ "version": "6.2.2-dev.78",
6929
6931
  "description": "",
6930
6932
  "license": "AGPL-3.0-only",
6931
6933
  "private": false,
@@ -6963,7 +6965,7 @@ async function migrate(version, projectDir = process.cwd()) {
6963
6965
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/design-system",
6964
6966
  "manifest": {
6965
6967
  "name": "@powerhousedao/design-system",
6966
- "version": "6.2.2-dev.77",
6968
+ "version": "6.2.2-dev.78",
6967
6969
  "description": "Powerhouse document-engineering design system — GraphQL scalar UI components for building consistent Powerhouse editors.",
6968
6970
  "files": ["dist", "theme.css"],
6969
6971
  "type": "module",
@@ -7133,7 +7135,7 @@ async function migrate(version, projectDir = process.cwd()) {
7133
7135
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/document-model",
7134
7136
  "manifest": {
7135
7137
  "name": "document-model",
7136
- "version": "6.2.2-dev.77",
7138
+ "version": "6.2.2-dev.78",
7137
7139
  "license": "AGPL-3.0-only",
7138
7140
  "private": false,
7139
7141
  "files": ["dist"],
@@ -7213,7 +7215,7 @@ async function migrate(version, projectDir = process.cwd()) {
7213
7215
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/opentelemetry-instrumentation-reactor",
7214
7216
  "manifest": {
7215
7217
  "name": "@powerhousedao/opentelemetry-instrumentation-reactor",
7216
- "version": "6.2.2-dev.77",
7218
+ "version": "6.2.2-dev.78",
7217
7219
  "description": "OpenTelemetry instrumentation for @powerhousedao/reactor",
7218
7220
  "type": "module",
7219
7221
  "sideEffects": false,
@@ -7251,7 +7253,7 @@ async function migrate(version, projectDir = process.cwd()) {
7251
7253
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/pglite-fs",
7252
7254
  "manifest": {
7253
7255
  "name": "@powerhousedao/pglite-fs",
7254
- "version": "6.2.2-dev.77",
7256
+ "version": "6.2.2-dev.78",
7255
7257
  "license": "AGPL-3.0-only",
7256
7258
  "type": "module",
7257
7259
  "repository": {
@@ -7286,7 +7288,7 @@ async function migrate(version, projectDir = process.cwd()) {
7286
7288
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/powerhouse-vetra-packages",
7287
7289
  "manifest": {
7288
7290
  "name": "@powerhousedao/powerhouse-vetra-packages",
7289
- "version": "6.2.2-dev.77",
7291
+ "version": "6.2.2-dev.78",
7290
7292
  "description": "",
7291
7293
  "keywords": [],
7292
7294
  "author": "",
@@ -7410,7 +7412,7 @@ async function migrate(version, projectDir = process.cwd()) {
7410
7412
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor",
7411
7413
  "manifest": {
7412
7414
  "name": "@powerhousedao/reactor",
7413
- "version": "6.2.2-dev.77",
7415
+ "version": "6.2.2-dev.78",
7414
7416
  "description": "Core Powerhouse reactor — stores documents, resolves conflicts, and reprocesses operation histories. Supports local, cloud, and decentralized storage backends.",
7415
7417
  "repository": {
7416
7418
  "url": "https://github.com/powerhouse-inc/powerhouse",
@@ -7451,6 +7453,7 @@ async function migrate(version, projectDir = process.cwd()) {
7451
7453
  "bench:records": "tsx bench/records/run-records.ts",
7452
7454
  "bench:records:verify": "tsx bench/records/run-records.ts verify",
7453
7455
  "bench:records:from-vitest": "tsx bench/records/run-from-vitest.ts",
7456
+ "bench:fix": "tsx bench/fix/run-fix.ts",
7454
7457
  "bench:ui": "node bench/ui/serve.mjs",
7455
7458
  "docker:up": "docker compose up -d",
7456
7459
  "docker:down": "docker compose down"
@@ -7498,7 +7501,7 @@ async function migrate(version, projectDir = process.cwd()) {
7498
7501
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-api",
7499
7502
  "manifest": {
7500
7503
  "name": "@powerhousedao/reactor-api",
7501
- "version": "6.2.2-dev.77",
7504
+ "version": "6.2.2-dev.78",
7502
7505
  "description": "GraphQL API layer for the Powerhouse reactor — auto-generated subgraphs per document model plus the core reactor subgraph for drive and document management.",
7503
7506
  "type": "module",
7504
7507
  "repository": {
@@ -7647,7 +7650,7 @@ async function migrate(version, projectDir = process.cwd()) {
7647
7650
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-attachments",
7648
7651
  "manifest": {
7649
7652
  "name": "@powerhousedao/reactor-attachments",
7650
- "version": "6.2.2-dev.77",
7653
+ "version": "6.2.2-dev.78",
7651
7654
  "license": "AGPL-3.0-only",
7652
7655
  "type": "module",
7653
7656
  "repository": {
@@ -7714,7 +7717,7 @@ async function migrate(version, projectDir = process.cwd()) {
7714
7717
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-browser",
7715
7718
  "manifest": {
7716
7719
  "name": "@powerhousedao/reactor-browser",
7717
- "version": "6.2.2-dev.77",
7720
+ "version": "6.2.2-dev.78",
7718
7721
  "license": "AGPL-3.0-only",
7719
7722
  "type": "module",
7720
7723
  "repository": {
@@ -7864,7 +7867,7 @@ async function migrate(version, projectDir = process.cwd()) {
7864
7867
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-drive",
7865
7868
  "manifest": {
7866
7869
  "name": "@powerhousedao/reactor-drive",
7867
- "version": "6.2.2-dev.77",
7870
+ "version": "6.2.2-dev.78",
7868
7871
  "license": "AGPL-3.0-only",
7869
7872
  "type": "module",
7870
7873
  "repository": {
@@ -7919,7 +7922,7 @@ async function migrate(version, projectDir = process.cwd()) {
7919
7922
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-group",
7920
7923
  "manifest": {
7921
7924
  "name": "@powerhousedao/reactor-group",
7922
- "version": "6.2.2-dev.77",
7925
+ "version": "6.2.2-dev.78",
7923
7926
  "description": "Platform document model for groups of member addresses, referenced by { group } principals in the auth scope.",
7924
7927
  "keywords": [
7925
7928
  "powerhouse",
@@ -7984,7 +7987,7 @@ async function migrate(version, projectDir = process.cwd()) {
7984
7987
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-hypercore",
7985
7988
  "manifest": {
7986
7989
  "name": "@powerhousedao/reactor-hypercore",
7987
- "version": "6.2.2-dev.77",
7990
+ "version": "6.2.2-dev.78",
7988
7991
  "description": "Hypercore-backed IOperationStore for the Powerhouse Reactor",
7989
7992
  "repository": {
7990
7993
  "url": "https://github.com/powerhouse-inc/powerhouse",
@@ -8027,7 +8030,7 @@ async function migrate(version, projectDir = process.cwd()) {
8027
8030
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/reactor-mcp",
8028
8031
  "manifest": {
8029
8032
  "name": "@powerhousedao/reactor-mcp",
8030
- "version": "6.2.2-dev.77",
8033
+ "version": "6.2.2-dev.78",
8031
8034
  "description": "MCP server for the Powerhouse reactor — exposes document model operations and drive management to AI coding assistants via the Model Context Protocol.",
8032
8035
  "type": "module",
8033
8036
  "repository": {
@@ -8102,7 +8105,7 @@ async function migrate(version, projectDir = process.cwd()) {
8102
8105
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/registry",
8103
8106
  "manifest": {
8104
8107
  "name": "@powerhousedao/registry",
8105
- "version": "6.2.2-dev.77",
8108
+ "version": "6.2.2-dev.78",
8106
8109
  "description": "Powerhouse package registry — resolves and manages document model package dependencies within the Powerhouse ecosystem.",
8107
8110
  "type": "module",
8108
8111
  "repository": {
@@ -8164,7 +8167,7 @@ async function migrate(version, projectDir = process.cwd()) {
8164
8167
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/renown",
8165
8168
  "manifest": {
8166
8169
  "name": "@renown/sdk",
8167
- "version": "6.2.2-dev.77",
8170
+ "version": "6.2.2-dev.78",
8168
8171
  "description": "Renown SDK — wallet-based authentication and user identity management for Powerhouse React applications.",
8169
8172
  "license": "AGPL-3.0-only",
8170
8173
  "private": false,
@@ -8301,7 +8304,7 @@ async function migrate(version, projectDir = process.cwd()) {
8301
8304
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/shared",
8302
8305
  "manifest": {
8303
8306
  "name": "@powerhousedao/shared",
8304
- "version": "6.2.2-dev.77",
8307
+ "version": "6.2.2-dev.78",
8305
8308
  "type": "module",
8306
8309
  "sideEffects": false,
8307
8310
  "publishConfig": { "access": "public" },
@@ -8475,7 +8478,7 @@ async function migrate(version, projectDir = process.cwd()) {
8475
8478
  "dir": "/home/runner/work/powerhouse/powerhouse/packages/vetra",
8476
8479
  "manifest": {
8477
8480
  "name": "@powerhousedao/vetra",
8478
- "version": "6.2.2-dev.77",
8481
+ "version": "6.2.2-dev.78",
8479
8482
  "license": "AGPL-3.0-only",
8480
8483
  "type": "module",
8481
8484
  "sideEffects": false,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["readdirSync","join","path","fs","fs","fs"],"sources":["../src/codegen/utils.ts","../src/codegen/features.ts","../src/codegen/generate.ts","../src/codegen/get-version.ts","../src/codegen/kysely.ts","../src/codegen/migrate.ts","../src/create-lib/checkout-project.ts","../src/create-lib/create-project.ts","../src/ts-morph-generator/core/FileGenerator.ts","../src/ts-morph-generator/core/ReducerGenerator.ts","../src/ts-morph-generator/utilities/DeclarationManager.ts","../src/ts-morph-generator/utilities/DirectoryManager.ts","../src/ts-morph-generator/utilities/ImportManager.ts","../src/ts-morph-generator/core/TSMorphCodeGenerator.ts"],"sourcesContent":["import type {\n DocumentModelDocument,\n DocumentModelGlobalState,\n} from \"@powerhousedao/shared/document-model\";\nimport { documentModelReducer } from \"@powerhousedao/shared/document-model\";\nimport { baseLoadFromFile } from \"document-model/node\";\nimport { readFile } from \"node:fs/promises\";\n\nexport function sortByKey<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).sort(([a], [b]) => a.localeCompare(b)),\n ) as T;\n}\n\nexport async function loadDocumentModel(\n path: string,\n): Promise<DocumentModelGlobalState> {\n let documentModel: DocumentModelGlobalState;\n try {\n if (!path) {\n throw new Error(\"Document model file not specified\");\n } else if (path.endsWith(\".zip\") || path.endsWith(\".phd\")) {\n const file = await baseLoadFromFile(path, documentModelReducer);\n documentModel = file.state.global;\n } else if (path.endsWith(\".json\")) {\n const data = await readFile(path, \"utf-8\");\n const parsedData = JSON.parse(data) as DocumentModelDocument;\n if (\"state\" in parsedData) {\n documentModel = parsedData.state.global;\n } else {\n documentModel = parsedData;\n }\n } else {\n throw new Error(\"File type not supported. Must be zip, phd, or json.\");\n }\n return documentModel;\n } catch (error) {\n throw (error as { code?: string }).code === \"MODULE_NOT_FOUND\"\n ? new Error(`Document model not found.`)\n : error;\n }\n}\n","import {\n ANALYTICS_ENGINE_CORE_PACKAGE,\n FEATURE_DEPENDENCIES,\n} from \"@powerhousedao/shared/clis\";\nimport { readdirSync, readFileSync, statSync } from \"fs\";\nimport { join } from \"path\";\nimport { type PackageJson, readPackage } from \"read-pkg\";\nimport { writePackage } from \"write-package\";\nimport { sortByKey } from \"./utils.js\";\n\nexport type Feature = keyof typeof FEATURE_DEPENDENCIES;\n\nfunction hasAnalyticsProcessor(processorsDir: string): boolean {\n const entries = readdirSync(processorsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const dir = join(processorsDir, entry.name);\n // processor.ts is the current shape; index.ts is the pre-migrate fallback.\n for (const filename of [\"processor.ts\", \"index.ts\"]) {\n try {\n const contents = readFileSync(join(dir, filename), \"utf-8\");\n if (contents.includes(ANALYTICS_ENGINE_CORE_PACKAGE)) return true;\n } catch {\n // file missing — try next candidate\n }\n }\n }\n return false;\n}\n\nexport function detectFeatures(projectDir: string): Feature[] {\n const features: Feature[] = [];\n const processorsDir = join(projectDir, \"processors\");\n const processorsStat = statSync(processorsDir, { throwIfNoEntry: false });\n if (processorsStat?.isDirectory() && hasAnalyticsProcessor(processorsDir)) {\n features.push(\"analyticsProcessor\");\n }\n return features;\n}\n\n// Idempotently adds the peer + dev deps required by `features` to the\n// project's package.json. Reuses the existing `document-model` pin as the\n// version anchor for new workspace peers so generated entries stay in sync\n// with whatever migrate last wrote. No-op if the entries are already present.\nexport async function syncFeatureDependencies(\n features: readonly Feature[],\n projectDir: string,\n): Promise<void> {\n if (features.length === 0) return;\n\n const packageJson = await readPackage({ cwd: projectDir, normalize: false });\n\n const pinVersion =\n packageJson.peerDependencies?.[\"document-model\"] ??\n packageJson.devDependencies?.[\"document-model\"];\n if (!pinVersion) {\n throw new Error(\n \"Cannot sync feature dependencies: project is missing `document-model` in peer/devDependencies. Run `ph migrate` first.\",\n );\n }\n\n const peerDependencies = {\n ...(packageJson.peerDependencies ?? {}),\n } as Record<string, string>;\n const devDependencies = {\n ...(packageJson.devDependencies ?? {}),\n } as Record<string, string>;\n\n const added: string[] = [];\n for (const feature of features) {\n const spec = FEATURE_DEPENDENCIES[feature];\n for (const pkg of spec.peerVersioned) {\n if (peerDependencies[pkg] === undefined) {\n peerDependencies[pkg] = pinVersion;\n added.push(pkg);\n }\n if (devDependencies[pkg] === undefined) {\n devDependencies[pkg] = pinVersion;\n }\n }\n const peerExternal = spec.peerExternal as Record<\n string,\n { peer: string; dev: string }\n >;\n for (const [pkg, versionSpec] of Object.entries(peerExternal)) {\n if (peerDependencies[pkg] === undefined) {\n peerDependencies[pkg] = versionSpec.peer;\n added.push(pkg);\n }\n if (devDependencies[pkg] === undefined) {\n devDependencies[pkg] = versionSpec.dev;\n }\n }\n }\n\n if (added.length === 0) return;\n\n const updated = {\n ...packageJson,\n peerDependencies: sortByKey(peerDependencies),\n devDependencies: sortByKey(devDependencies),\n } as PackageJson;\n await writePackage(projectDir, updated);\n console.log(`Added peer/dev dependencies: ${added.join(\", \")}`);\n}\n","import { type DocumentModelGlobalState } from \"@powerhousedao/shared/document-model\";\nimport type { ProcessorApps } from \"@powerhousedao/shared/processors\";\nimport { kebabCase } from \"change-case\";\nimport {\n pruneManifestSection,\n tsMorphGenerateApp,\n tsMorphGenerateDocumentEditor,\n tsMorphGenerateDocumentModel,\n tsMorphGenerateProcessor,\n tsMorphGenerateSubgraph,\n} from \"file-builders\";\nimport { readdirSync } from \"node:fs\";\nimport {\n filter,\n isDefined,\n isIncludedIn,\n isTruthy,\n map,\n pipe,\n prop,\n unique,\n} from \"remeda\";\nimport type { Project } from \"ts-morph\";\nimport {\n getAppMetadata,\n getEditorMetadata,\n getOrCreateDirectory,\n getProcessorMetadata,\n getSubgraphMetadata,\n loadDocumentModelInDir,\n} from \"utils\";\nimport { loadDocumentModel } from \"./utils.js\";\n\nexport async function generateDocumentModel(\n documentModelState: DocumentModelGlobalState,\n project: Project,\n) {\n await tsMorphGenerateDocumentModel(documentModelState, project);\n}\n\n/* Runs generate for each document model json file found in the project's `document-models` directory */\nexport async function generateAllDocumentModels(project: Project) {\n const { directory: documentModelsDir } = getOrCreateDirectory(\n project,\n \"document-models\",\n );\n const documentModelsDirPath = documentModelsDir.getPath();\n const projectDir = documentModelsDir.getParentOrThrow().getPath();\n const documentModelStateFiles = pipe(\n readdirSync(documentModelsDirPath, { withFileTypes: true }),\n map(loadDocumentModelInDir),\n filter(isDefined),\n );\n\n for (const documentModelState of documentModelStateFiles) {\n await generateDocumentModel(documentModelState, project);\n }\n\n await pruneManifestSection(\n projectDir,\n \"documentModels\",\n documentModelStateFiles.map((s) => s.id),\n );\n}\nexport async function generateFromFile(filePath: string, project: Project) {\n // load document model spec from file\n const documentModelState = await loadDocumentModel(filePath);\n\n // delegate to shared generation function\n await generateDocumentModel(documentModelState, project);\n}\n\ntype GenerateEditorArgs = {\n editorName: string;\n documentTypes: string[];\n editorId?: string;\n editorDirName?: string;\n};\nexport async function generateEditor(\n args: GenerateEditorArgs,\n project: Project,\n) {\n const {\n editorName,\n documentTypes,\n editorId: editorIdArg,\n editorDirName,\n } = args;\n\n if (documentTypes.length > 1) {\n throw new Error(\"Multiple document types are not supported yet\");\n }\n\n const documentModelId = documentTypes[0];\n const editorId = editorIdArg || kebabCase(editorName);\n const editorDir = editorDirName || kebabCase(editorName);\n\n await tsMorphGenerateDocumentEditor({\n project,\n editorDir,\n documentModelId,\n editorName,\n editorId,\n });\n}\n\n/* Runs generate for all editors found in the project's `editors` directory.\n * Note: we intentionally filter out editors with the document type \"powerhouse/document-drive\".\n * These are handled separately by the `generateAllApps` function.\n */\nexport async function generateAllEditors(project: Project) {\n const { directory: editorsDir } = getOrCreateDirectory(project, \"editors\");\n const projectDir = editorsDir.getParentOrThrow().getPath();\n\n /* An editor's `id`, `name`, and `documentTypes` args can be found in the `module.ts` file */\n const editorsToAdd = pipe(\n editorsDir.getDirectories(),\n map((dir) => dir.getBaseName()),\n map((dirName) => getEditorMetadata(project, dirName)),\n filter(isTruthy),\n filter(\n ({ documentTypes }) =>\n !isIncludedIn(\"powerhouse/document-drive\", documentTypes),\n ),\n );\n\n for (const editorToAdd of editorsToAdd) {\n const {\n name: editorName,\n id: editorId,\n dirName: editorDirName,\n documentTypes,\n } = editorToAdd;\n\n await generateEditor(\n {\n editorName,\n editorId,\n editorDirName,\n documentTypes,\n },\n project,\n );\n }\n\n await pruneManifestSection(\n projectDir,\n \"editors\",\n editorsToAdd.map((e) => e.id),\n );\n}\n\ntype GenerateAppArgs = {\n appName: string;\n appId?: string;\n allowedDocumentTypes?: string[];\n isDragAndDropEnabled?: boolean;\n appDirName?: string;\n};\nexport async function generateApp(args: GenerateAppArgs, project: Project) {\n const {\n appName,\n appId,\n allowedDocumentTypes,\n isDragAndDropEnabled,\n appDirName,\n } = args;\n\n await tsMorphGenerateApp({\n project,\n editorDir: appDirName || kebabCase(appName),\n editorName: appName,\n editorId: appId ?? kebabCase(appName),\n allowedDocumentModelIds: allowedDocumentTypes ?? [],\n isDragAndDropEnabled: isDragAndDropEnabled ?? true,\n });\n}\n\n/* Runs generate for all apps found in the project's `editors` directory.\n * Note: we intentionally filter out editors which do not have the document type \"powerhouse/document-drive\".\n * These are handled separately by the `generateAllEditors` function.\n */\nexport async function generateAllApps(project: Project) {\n const { directory: editorsDir } = getOrCreateDirectory(project, \"editors\");\n const projectDir = editorsDir.getParentOrThrow().getPath();\n\n /* An editor's `id`, `name`, and `documentTypes` args can be found in the `module.ts` file */\n const appsToAdd = pipe(\n editorsDir.getDirectories(),\n map((dir) => dir.getBaseName()),\n map((dirName) => getAppMetadata(project, dirName)),\n filter(isTruthy),\n );\n\n for (const appToAdd of appsToAdd) {\n const {\n name: appName,\n id: appId,\n dirName: appDirName,\n allowedDocumentTypes,\n isDragAndDropEnabled,\n } = appToAdd;\n await generateApp(\n {\n appName,\n appDirName,\n appId,\n allowedDocumentTypes,\n isDragAndDropEnabled,\n },\n project,\n );\n }\n\n await pruneManifestSection(\n projectDir,\n \"apps\",\n appsToAdd.map((a) => a.id),\n );\n}\nexport async function generateSubgraph(subgraphName: string, project: Project) {\n await tsMorphGenerateSubgraph({ subgraphName, project });\n}\n\n/* Runs generate for each directory found in the project's `subgraphs` directory */\nexport async function generateAllSubgraphs(project: Project) {\n const { directory: subgraphsDir } = getOrCreateDirectory(\n project,\n \"subgraphs\",\n );\n const projectDir = subgraphsDir.getParentOrThrow().getPath();\n /* The subgraph's name is found in the `index.ts` file */\n const subgraphNames = pipe(\n subgraphsDir.getDirectories(),\n map((dir) => dir.getBaseName()),\n map((dirName) => getSubgraphMetadata(project, dirName)),\n map(prop(\"subgraphName\")),\n filter(isDefined),\n unique(),\n );\n for (const subgraphName of subgraphNames) {\n await generateSubgraph(subgraphName, project);\n }\n\n await pruneManifestSection(\n projectDir,\n \"subgraphs\",\n subgraphNames.map((name) => kebabCase(name)),\n );\n}\n\nexport async function generateProcessor(\n args: {\n processorName: string;\n processorType: \"analytics\" | \"relationalDb\";\n processorApps: ProcessorApps;\n documentTypes: string[];\n },\n project: Project,\n) {\n return await tsMorphGenerateProcessor({\n project,\n ...args,\n });\n}\n\n/* Runs generate for each directory found in the project's `processors` directory */\nexport async function generateAllProcessors(project: Project) {\n const { directory: processorsDir } = getOrCreateDirectory(\n project,\n \"processors\",\n );\n const projectDir = processorsDir.getParentOrThrow().getPath();\n const processorsToGenerate = pipe(\n processorsDir.getDirectories(),\n map((dir) => dir.getBaseName()),\n map((dirName) => getProcessorMetadata(project, dirName)),\n );\n\n for (const processorArgs of processorsToGenerate) {\n await generateProcessor(processorArgs, project);\n }\n\n await pruneManifestSection(\n projectDir,\n \"processors\",\n processorsToGenerate.map((p) => kebabCase(p.processorName)),\n );\n}\n\n/* Runs each module type's generateAll{moduleType} function for the current project */\nexport async function generateAll(project: Project) {\n await generateAllDocumentModels(project);\n await generateAllEditors(project);\n await generateAllApps(project);\n await generateAllSubgraphs(project);\n await generateAllProcessors(project);\n}\n","declare const CODEGEN_VERSION: string | undefined;\n\nexport function getCodegenVersion(): string {\n if (typeof CODEGEN_VERSION !== \"undefined\") return CODEGEN_VERSION;\n return (\n process.env.WORKSPACE_VERSION ||\n process.env.npm_package_version ||\n \"unknown\"\n );\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join, resolve } from \"node:path\";\n\nfunction getKyselyPgLiteBin(): string {\n const require = createRequire(import.meta.url);\n\n const paths = require.resolve.paths(\"kysely-pglite\");\n if (paths) {\n for (const basePath of paths) {\n const pkgRoot = join(basePath, \"kysely-pglite\");\n const binPath = join(pkgRoot, \"bin/run.js\");\n\n if (existsSync(binPath)) {\n return binPath;\n }\n }\n }\n\n throw new Error(\"Could not find kysely-pglite/bin/run.js\");\n}\n\nexport interface IOptions {\n migrationFile: string;\n schemaFile?: string;\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd?: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: \"inherit\",\n shell: true,\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n });\n}\n\nexport async function generateDBSchema({\n migrationFile,\n schemaFile,\n}: IOptions) {\n const outFile = schemaFile ?? resolve(migrationFile, \"../schema.ts\");\n\n try {\n const kyselyBinPath = getKyselyPgLiteBin();\n // Use kysely-pglite CLI to handle TypeScript compilation and module resolution\n await runCommand(\n \"node\",\n [kyselyBinPath, migrationFile, \"--outFile\", outFile],\n process.cwd(),\n );\n\n console.log(`Schema types generated at ${outFile}`);\n } catch (error) {\n console.error(\"Error running migration:\", error);\n }\n}\n","import {\n externalDevDependencies,\n FEATURE_DEPENDENCIES,\n getPackageManagerAtPowerhouseProjectDirPath,\n getPowerhouseProjectInstallCommand,\n LEGACY_LINT_FORMAT_DEPENDENCIES,\n LEGACY_LINT_FORMAT_FILES,\n packageJsonExports,\n packageScripts,\n PEER_EXTERNAL_DEPENDENCIES,\n runCmd,\n VERSIONED_DEV_DEPENDENCIES,\n VERSIONED_PEER_DEPENDENCIES,\n} from \"@powerhousedao/shared/clis\";\nimport console from \"console\";\nimport { writeAllGeneratedProjectFiles } from \"file-builders\";\nimport { cpSync, mkdirSync, readdirSync, rmSync, statSync } from \"fs\";\nimport npmFetch from \"npm-registry-fetch\";\nimport { join } from \"path\";\nimport { type PackageJson, readPackage } from \"read-pkg\";\nimport {\n filter,\n fromKeys,\n isTruthy,\n keys,\n map,\n mapValues,\n merge,\n omit,\n pipe,\n prop,\n} from \"remeda\";\nimport type { Project } from \"ts-morph\";\nimport { buildTsMorphProject, fixGenerateMockImports } from \"utils\";\nimport { writePackage } from \"write-package\";\nimport { detectFeatures } from \"./features.js\";\nimport { generateAll } from \"./generate.js\";\nimport { sortByKey } from \"./utils.js\";\n\n// Anchor dist-tag resolution to ph-cli. Releases publish in topological order\n// (releaseGraph), so ph-cli — a top-level consumer — is published *after* its\n// workspace dependencies, and a dist-tag only moves once that package is\n// published. Resolving the tag against ph-cli therefore yields a version whose\n// entire workspace dependency closure is already on the registry. Anchoring to\n// an arbitrary `WORKSPACE_PACKAGES[0]` (e.g. codegen) instead races during the\n// publish window: codegen@dev.N can be tagged before ph-cli@dev.N exists, so\n// pinning every workspace dep to that version makes `pnpm i` fail with\n// ERR_PNPM_NO_MATCHING_VERSION. This matches the anchor the ph-cli migrate\n// command already uses (clis/ph-cli/src/services/migrate.ts).\nconst VERSION_ANCHOR_PACKAGE = \"@powerhousedao/ph-cli\";\n\n/* Uses the npm cli's fetch function to get the version for a specified tag */\nexport async function getFullyQualifiedWorkspacePackageVersion(\n versionOrTag: string,\n) {\n const isTag =\n versionOrTag === \"latest\" ||\n versionOrTag === \"staging\" ||\n versionOrTag === \"dev\";\n\n if (!isTag) return versionOrTag;\n const anchorPackageName =\n WORKSPACE_PACKAGES.find(\n (pkg) => pkg.manifest.name === VERSION_ANCHOR_PACKAGE,\n )?.manifest.name ?? WORKSPACE_PACKAGES[0].manifest.name!;\n const result = (await npmFetch.json(anchorPackageName)) as {\n \"dist-tags\": Record<\"latest\" | \"staging\" | \"dev\", string>;\n };\n return result[\"dist-tags\"][versionOrTag];\n}\n\nexport function fixLegacyImportPaths(\n project: Project,\n packageName: string | undefined,\n) {\n if (!packageName) {\n console.error(\"No package name found in package.json.\");\n return;\n }\n const sourceFiles = project.getSourceFiles();\n for (const sourceFile of sourceFiles) {\n const importStatements = sourceFile.getImportDeclarations();\n for (const importStatement of importStatements) {\n const moduleSpecifier = importStatement.getModuleSpecifier();\n const moduleSpecifierText = moduleSpecifier.getLiteralText();\n // remove usage of the old `package-name/` style paths\n if (moduleSpecifierText.includes(packageName)) {\n moduleSpecifier.setLiteralValue(\n moduleSpecifierText.replace(`${packageName}/`, \"\"),\n );\n }\n // attempt to fix absolute import paths for document models like `../../../document-models/model/something/something.js`\n // these don't work anymore with the versioned document models, since the absolute file paths are different\n const match = moduleSpecifierText.match(\n /^(\\.\\.\\/)+document-models\\/([^/]+)(?!\\/v\\d+(?:\\/|$))(?:\\/.*)?$/,\n );\n\n if (match) {\n moduleSpecifier.setLiteralValue(`document-models/${match[2]}`);\n }\n }\n fixGenerateMockImports(sourceFile);\n }\n}\n\nfunction isProtectedVersionSpec(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n (value.startsWith(\"workspace:\") || value.startsWith(\"catalog:\"))\n );\n}\n\n// Keeps user-declared `workspace:*` / `catalog:` refs intact when the caller\n// would otherwise replace them with a hard pin during migration.\nfunction preserveProtected(\n newValues: Record<string, string>,\n existingSources: ReadonlyArray<\n Partial<Record<string, string | undefined>> | undefined\n >,\n): Record<string, string> {\n const result: Record<string, string> = { ...newValues };\n for (const key of Object.keys(newValues)) {\n for (const source of existingSources) {\n const existing = source?.[key];\n if (isProtectedVersionSpec(existing)) {\n result[key] = existing;\n break;\n }\n }\n }\n return result;\n}\n\nexport async function migrate(version: string, projectDir = process.cwd()) {\n const fullyQualifiedVersion =\n await getFullyQualifiedWorkspacePackageVersion(version);\n\n const packageJson = await readPackage({\n cwd: projectDir,\n normalize: false,\n });\n const exports = packageJsonExports;\n const scripts = merge(packageJson.scripts, packageScripts);\n const workspacePackageNames = filter(\n map(WORKSPACE_PACKAGES, prop(\"manifest\", \"name\")),\n isTruthy,\n );\n\n const features = detectFeatures(projectDir);\n const featurePeerVersioned = features.flatMap(\n (f) => FEATURE_DEPENDENCIES[f].peerVersioned as readonly string[],\n );\n const featurePeerExternal = features.reduce<\n Record<string, { peer: string; dev: string }>\n >((acc, f) => ({ ...acc, ...FEATURE_DEPENDENCIES[f].peerExternal }), {});\n\n const managedPeerVersioned = [\n ...VERSIONED_PEER_DEPENDENCIES,\n ...featurePeerVersioned,\n ];\n const managedPeerNames = [\n ...managedPeerVersioned,\n ...keys(PEER_EXTERNAL_DEPENDENCIES),\n ...keys(featurePeerExternal),\n ];\n const managedDevVersioned = [\n ...VERSIONED_DEV_DEPENDENCIES,\n ...managedPeerVersioned,\n ];\n const managedDevNames = [\n ...managedDevVersioned,\n ...keys(externalDevDependencies),\n ...keys(featurePeerExternal),\n ];\n\n const peerExternals = {\n ...mapValues(PEER_EXTERNAL_DEPENDENCIES, (v) => v.peer),\n ...mapValues(featurePeerExternal, (v) => v.peer),\n };\n const peerDevPins = {\n ...mapValues(PEER_EXTERNAL_DEPENDENCIES, (v) => v.dev),\n ...mapValues(featurePeerExternal, (v) => v.dev),\n };\n\n const existingDepSources = [\n packageJson.dependencies,\n packageJson.devDependencies,\n packageJson.peerDependencies,\n ];\n\n const peerDependencies = pipe(\n packageJson.peerDependencies ?? {},\n omit([...managedDevNames, ...LEGACY_LINT_FORMAT_DEPENDENCIES]),\n merge(\n preserveProtected(\n {\n ...fromKeys(managedPeerVersioned, () => fullyQualifiedVersion),\n ...peerExternals,\n },\n existingDepSources,\n ),\n ),\n mapValues((value, key) =>\n isProtectedVersionSpec(value)\n ? value\n : workspacePackageNames.includes(key)\n ? fullyQualifiedVersion\n : value,\n ),\n sortByKey,\n );\n\n const devDependencies = pipe(\n merge(packageJson.dependencies ?? {}, packageJson.devDependencies ?? {}),\n omit([...managedPeerNames, ...LEGACY_LINT_FORMAT_DEPENDENCIES]),\n merge(\n preserveProtected(\n {\n ...fromKeys(managedDevVersioned, () => fullyQualifiedVersion),\n ...externalDevDependencies,\n ...peerDevPins,\n },\n existingDepSources,\n ),\n ),\n mapValues((value, key) =>\n isProtectedVersionSpec(value)\n ? value\n : workspacePackageNames.includes(key)\n ? fullyQualifiedVersion\n : value,\n ),\n sortByKey,\n );\n\n console.log(\"Updating package.json...\");\n const updatedPackageJson: PackageJson = {\n ...packageJson,\n type: packageJson.type ?? \"module\",\n sideEffects: packageJson.sideEffects ?? false,\n files: packageJson.files ?? [\"/dist\"],\n exports,\n scripts,\n peerDependencies,\n devDependencies,\n } as PackageJson;\n // Runtime `dependencies` block is no longer emitted — the bundled dist\n // self-contains everything except the declared peers.\n delete (updatedPackageJson as { dependencies?: unknown }).dependencies;\n await writePackage(projectDir, updatedPackageJson);\n\n console.log(\"Removing legacy lint/format config files...\");\n removeLegacyLintFormatFiles(projectDir);\n console.log(\"Overwriting project root files...\");\n await writeAllGeneratedProjectFiles(projectDir);\n console.log(\"Moving unversioned document models...\");\n moveLegacyDocumentModels(projectDir);\n const project = buildTsMorphProject(projectDir);\n console.log(\"Fixing legacy import paths...\");\n fixLegacyImportPaths(project, packageJson.name);\n console.log(\"Installing dependencies...\");\n await installProjectDependencies(projectDir);\n console.log(\"Re-generating code...\");\n await generateAll(project);\n await project.save();\n}\n\nfunction removeLegacyLintFormatFiles(projectDir: string) {\n for (const name of LEGACY_LINT_FORMAT_FILES) {\n rmSync(join(projectDir, name), { force: true });\n }\n}\n\nasync function installProjectDependencies(projectDir: string) {\n const agent = await getPackageManagerAtPowerhouseProjectDirPath(projectDir);\n if (!agent) {\n throw new Error(\n \"Failed to detect your package manager. Run install manually.\",\n );\n }\n const installCommand = await getPowerhouseProjectInstallCommand(agent);\n console.log(`Installing dependencies with \\`${agent}\\``);\n runCmd(installCommand, { cwd: projectDir });\n}\n\nfunction moveLegacyDocumentModels(projectDir: string) {\n const fileNamesToDelete = [\n \"actions.ts\",\n \"hooks.ts\",\n \"module.ts\",\n \"index.ts\",\n \"utils.ts\",\n \"schema.graphql\",\n ];\n const dirNamesToCopy = [\"src\", \"gen\"];\n const dirs = pipe(\n readdirSync(join(projectDir, \"document-models\"), { withFileTypes: true }),\n filter((entry) => entry.isDirectory()),\n filter(\n (dir) =>\n statSync(join(dir.parentPath, dir.name, `${dir.name}.json`), {\n throwIfNoEntry: false,\n })?.isFile() ?? false,\n ),\n map((dir) => join(dir.parentPath, dir.name)),\n );\n\n for (const dirPath of dirs) {\n for (const name of fileNamesToDelete) {\n const filePath = join(dirPath, name);\n rmSync(filePath, { force: true });\n }\n const versionDirPath = join(dirPath, \"v1\");\n const versionDirExists =\n statSync(versionDirPath, { throwIfNoEntry: false })?.isDirectory() ??\n false;\n if (!versionDirExists) {\n mkdirSync(versionDirPath);\n }\n for (const dirName of dirNamesToCopy) {\n const srcDirPath = join(dirPath, dirName);\n const srcDirExists =\n statSync(srcDirPath, { throwIfNoEntry: false })?.isDirectory() ?? false;\n if (!srcDirExists) continue;\n const destDirPath = join(versionDirPath, dirName);\n cpSync(srcDirPath, destDirPath, {\n recursive: true,\n force: false,\n errorOnExist: false,\n });\n rmSync(srcDirPath, {\n force: true,\n recursive: true,\n });\n }\n }\n}\n","import path from \"node:path\";\nimport { runCmd } from \"@powerhousedao/shared/clis\";\n/**\n * Clones a git repository and returns the path to the cloned project.\n * @param repositoryUrl - The URL of the git repository to clone\n * @returns The absolute path to the cloned project directory\n */\nexport function cloneRepository(repositoryUrl: string): string {\n try {\n console.log(\n \"\\x1b[33m\",\n `Cloning repository from ${repositoryUrl}...`,\n \"\\x1b[0m\",\n );\n runCmd(`git clone ${repositoryUrl}`);\n\n // Extract project name from repository URL\n // e.g., https://github.com/org/repo.git -> repo\n const repoName = repositoryUrl\n .split(\"/\")\n .pop()\n ?.replace(/\\.git$/, \"\");\n\n if (!repoName) {\n throw new Error(\"Could not determine project name from repository URL\");\n }\n\n const projectPath = path.join(process.cwd(), repoName);\n return projectPath;\n } catch (error) {\n console.log(error);\n throw error;\n }\n}\n\n/**\n * Installs dependencies in a project directory using the specified package manager.\n * @param projectPath - The absolute path to the project directory\n * @param packageManager - The package manager to use (npm, pnpm, yarn, bun)\n */\nexport function installDependencies(\n projectPath: string,\n packageManager: string,\n): void {\n try {\n process.chdir(projectPath);\n\n console.log(\n \"\\x1b[34m\",\n `Installing dependencies with ${packageManager}...`,\n \"\\x1b[0m\",\n );\n const extra =\n packageManager === \"pnpm\" ? \" --config.minimum-release-age=0\" : \"\";\n runCmd(`${packageManager} install --loglevel error${extra}`);\n\n console.log(\"\\x1b[32m\", \"Dependencies installed successfully!\", \"\\x1b[0m\");\n console.log();\n } catch (error) {\n console.log(error);\n throw error;\n }\n}\n","import { runCmd, writeFileEnsuringDir } from \"@powerhousedao/shared/clis\";\nimport chalk from \"chalk\";\nimport fs from \"node:fs\";\nimport path from \"path\";\nimport { gitIgnoreTemplate } from \"templates\";\nimport { runOxfmt } from \"utils\";\nimport {\n applyProjectCustomizations,\n writeAllGeneratedProjectFiles,\n writeProjectRootFiles,\n} from \"file-builders\";\n\n// Install recipes for `--clone`. Only managers with a cache-miss-fails\n// offline mode are listed; yarn needs an opt-in offline mirror and bun has\n// no real offline mode (https://github.com/oven-sh/bun/issues/7956).\ntype CloneRecipe = { lockfile: string; install: string };\nconst CLONE_RECIPES: Record<string, CloneRecipe | undefined> = {\n pnpm: {\n lockfile: \"pnpm-lock.yaml\",\n install: \"pnpm install --frozen-lockfile --offline\",\n },\n npm: {\n lockfile: \"package-lock.json\",\n install: \"npm ci --offline\",\n },\n};\n\ntype CreateProjectArgs = {\n name: string;\n packageManager: string;\n tag?: string;\n version?: string;\n remoteDrive?: string;\n skipGitInit?: boolean;\n skipInstall?: boolean;\n /**\n * Path to an existing scaffolded project to clone instead of generating +\n * resolving deps from scratch. The clone's source + pnpm-lock.yaml are\n * copied (node_modules is not — it's rebuilt from the lockfile via the warm\n * pnpm store with `pnpm install --frozen-lockfile --offline`). Requires\n * packageManager === \"pnpm\".\n */\n clone?: string;\n};\nexport async function createProject({\n name,\n packageManager,\n tag,\n version,\n remoteDrive,\n skipGitInit,\n skipInstall,\n clone,\n}: CreateProjectArgs) {\n const appPath = path.join(process.cwd(), name);\n\n if (fs.existsSync(appPath)) {\n throw new Error(\n `⛔ The folder \"${name}\" already exists in the current directory, please give it another name.`,\n );\n }\n\n if (clone) {\n await createProjectFromClone({\n name,\n appPath,\n clone,\n packageManager,\n skipGitInit,\n skipInstall,\n remoteDrive,\n });\n return;\n }\n\n // Create a new directory for the project\n console.log(chalk.blue(`▶️ Creating directory for project \"${name}\"...\\n`));\n fs.mkdirSync(appPath);\n process.chdir(appPath);\n console.log(chalk.green(`✅ Project directory created\\n`));\n\n await writeFileEnsuringDir(\".gitignore\", gitIgnoreTemplate);\n if (!skipGitInit) {\n // Create a .gitignore file, then initialize the git repository\n console.log(chalk.blue(`▶️ Initializing git repository...\\n`));\n runCmd(`git init`);\n console.log(chalk.green(`\\n✅ Git repository initialized\\n`));\n }\n\n // Write the boilerplate files for the project\n console.log(chalk.blue(`▶️ Creating project boilerplate files...\\n`));\n await writeProjectRootFiles({\n name,\n tag,\n version,\n remoteDrive,\n packageManager,\n });\n await writeAllGeneratedProjectFiles();\n // Must run last: it rewrites `.mcp.json` / `.cursor/mcp.json`, which\n // `writeAllGeneratedProjectFiles` has only just created.\n await applyProjectCustomizations({ name, projectDir: appPath, remoteDrive });\n console.log(chalk.green(`✅ Project boilerplate files created\\n`));\n\n if (!skipInstall) {\n // Install the project dependencies with the specified package manager\n console.log(\n chalk.blue(\n `▶️ Installing project dependencies with ${packageManager}...\\n`,\n ),\n );\n const extra =\n packageManager === \"pnpm\" ? \" --config.minimum-release-age=0\" : \"\";\n runCmd(`${packageManager} install${extra}`);\n console.log(chalk.green(`\\n✅ Project dependencies installed\\n`));\n }\n\n // Use the installed version of `oxfmt` to format the generated code\n console.log(chalk.blue(`▶️ Formatting boilerplate project files...\\n`));\n await runOxfmt();\n console.log(chalk.green(`✅ Boilerplate files formatted\\n`));\n\n // Project creation complete\n console.log(chalk.bold(`🎉 Successfully created project \"${name}\" 🎉\\n`));\n}\n\n/**\n * Fast path for `ph init --clone <path>`: copy an already-scaffolded project's\n * source + lockfile (NOT node_modules), re-apply the per-project\n * customizations, then rebuild node_modules with\n * `pnpm install --frozen-lockfile --offline`. pnpm materializes the tree from\n * the warm store via clone/hardlink — far faster and ~0 extra disk vs a fresh\n * resolve+install, and the lockfile guarantees an identical dependency set.\n * Requires the cloned project's packages to be present in the local pnpm\n * store (which is the case in an image where the source was scaffolded at\n * build).\n */\nasync function createProjectFromClone(args: {\n name: string;\n appPath: string;\n clone: string;\n packageManager: string;\n skipGitInit?: boolean;\n skipInstall?: boolean;\n remoteDrive?: string;\n}) {\n const {\n name,\n appPath,\n clone,\n packageManager,\n skipGitInit,\n skipInstall,\n remoteDrive,\n } = args;\n // --clone needs a package manager with a hard-offline install mode that\n // refuses to hit the network on a cache miss. pnpm and npm qualify; yarn\n // and bun do not (bun has no offline flag at all — cache misses silently\n // re-fetch).\n const recipe = CLONE_RECIPES[packageManager];\n if (!recipe) {\n throw new Error(\n `⛔ --clone is only compatible with --pnpm or --npm (got \"${packageManager}\").`,\n );\n }\n const clonePath = path.resolve(process.cwd(), clone);\n if (!fs.existsSync(clonePath) || !fs.statSync(clonePath).isDirectory()) {\n throw new Error(\n `⛔ Clone source \"${clone}\" not found (resolved to \"${clonePath}\"). Pass a path to an existing scaffolded project.`,\n );\n }\n if (!fs.existsSync(path.join(clonePath, recipe.lockfile))) {\n throw new Error(\n `⛔ Clone source \"${clone}\" has no ${recipe.lockfile}. --clone with --${packageManager} requires a committed lockfile.`,\n );\n }\n\n // Copy source + lockfile only; node_modules is rebuilt from the store below,\n // and the source's .git is irrelevant (we re-init fresh).\n console.log(chalk.blue(`▶️ Cloning project from \"${clone}\"...\\n`));\n fs.cpSync(clonePath, appPath, {\n recursive: true,\n filter: (src) => {\n const base = path.basename(src);\n // Skip deps (rebuilt from the lockfile), git history (re-init'd), and\n // build artifacts (regenerated) so the new project starts clean.\n return (\n base !== \"node_modules\" &&\n base !== \".git\" &&\n base !== \"dist\" &&\n !base.endsWith(\".tsbuildinfo\")\n );\n },\n });\n console.log(chalk.green(`✅ Project files cloned\\n`));\n\n if (!skipGitInit) {\n console.log(chalk.blue(`▶️ Initializing git repository...\\n`));\n runCmd(`git init`, { cwd: appPath });\n console.log(chalk.green(`\\n✅ Git repository initialized\\n`));\n }\n\n console.log(chalk.blue(`▶️ Applying project customizations...\\n`));\n await applyProjectCustomizations({ name, projectDir: appPath, remoteDrive });\n console.log(chalk.green(`✅ Project customizations applied\\n`));\n\n if (!skipInstall) {\n // Rebuild node_modules from the lockfile, offline, via the warm cache.\n console.log(\n chalk.blue(`▶️ Installing dependencies from lockfile (offline)...\\n`),\n );\n runCmd(recipe.install, { cwd: appPath });\n console.log(chalk.green(`\\n✅ Dependencies installed from lockfile\\n`));\n }\n\n console.log(\n chalk.bold(`🎉 Successfully cloned project \"${name}\" from \"${clone}\" 🎉\\n`),\n );\n}\n","import type { DeclarationManager } from \"../utilities/DeclarationManager.js\";\nimport type { DirectoryManager } from \"../utilities/DirectoryManager.js\";\nimport type { ImportManager } from \"../utilities/ImportManager.js\";\nimport type { GenerationContext } from \"./GenerationContext.js\";\n\nexport abstract class FileGenerator {\n constructor(\n protected importManager: ImportManager,\n protected directoryManager: DirectoryManager,\n protected declarationManager: DeclarationManager,\n ) {}\n\n abstract generate(context: GenerationContext): Promise<void>;\n}\n","import { camelCase, kebabCase, pascalCase } from \"change-case\";\nimport type { OperationErrorSpecification } from \"@powerhousedao/shared/document-model\";\nimport type {\n MethodDeclaration,\n ObjectLiteralExpression,\n SourceFile,\n} from \"ts-morph\";\nimport { SyntaxKind, VariableDeclarationKind } from \"ts-morph\";\nimport { FileGenerator } from \"./FileGenerator.js\";\nimport type {\n CodegenOperation,\n GenerationContext,\n} from \"./GenerationContext.js\";\n\nexport class ReducerGenerator extends FileGenerator {\n async generate(context: GenerationContext): Promise<void> {\n // Skip if no actions to generate\n if (context.operations.length === 0) return;\n\n const filePath = this.getOutputPath(context);\n const sourceFile = await this.directoryManager.createSourceFile(\n context.project,\n filePath,\n );\n\n const packageName = context.packageName;\n // Reducer-specific import logic\n const typeImportName = `${pascalCase(context.docModel.name)}${pascalCase(context.module.name)}Operations`;\n const typeImportPath = `${packageName}/document-models/${kebabCase(context.docModel.name)}`;\n\n // Import management (shared utility)\n this.importManager.replaceImportByName(\n sourceFile,\n typeImportName,\n typeImportPath,\n true,\n );\n\n // AST logic (specific to reducers)\n this.createReducerObject(sourceFile, typeImportName, context);\n\n // Detect and import error classes used in the actual reducer code (after generation)\n this.addErrorImports(sourceFile, context);\n\n await sourceFile.save();\n }\n\n private static getDefaultReducerCode(methodName: string): string[] {\n return [\n `// TODO: Implement \"${methodName}\" reducer`,\n `throw new Error('Reducer \"${methodName}\" not yet implemented');`,\n ];\n }\n\n private addErrorImports(\n sourceFile: SourceFile,\n context: GenerationContext,\n ): void {\n // Collect all errors from all operations\n const allErrors: OperationErrorSpecification[] = [];\n\n context.operations.forEach((operation) => {\n if (Array.isArray(operation.errors)) {\n operation.errors\n .filter((error) => error.name)\n .forEach((error) => {\n // Deduplicate errors by name\n if (!allErrors.find((e) => e.name === error.name)) {\n allErrors.push(error);\n }\n });\n }\n });\n\n if (allErrors.length === 0) return;\n\n // Analyze the actual source file content to find which errors are used\n const sourceFileContent = sourceFile.getFullText();\n const usedErrors = new Set<string>();\n\n allErrors.forEach((error) => {\n // Check if error class name is mentioned anywhere in the source file\n // Look for patterns like \"new ErrorName\" or \"throw ErrorName\" or \"ErrorName(\"\n const errorPattern = new RegExp(`\\\\b${error.name}\\\\b`, \"g\");\n if (errorPattern.test(sourceFileContent)) {\n usedErrors.add(error.name!);\n }\n });\n\n // Add imports for used errors (only if they're not already imported)\n if (usedErrors.size > 0) {\n const errorImportPath = `../../gen/${kebabCase(context.module.name)}/error.js`;\n const errorClassNames = Array.from(usedErrors);\n\n // Check if imports already exist to avoid duplicates\n const existingImports = sourceFile.getImportDeclarations();\n const existingErrorImport = existingImports.find(\n (importDecl) =>\n importDecl.getModuleSpecifierValue() === errorImportPath,\n );\n\n if (existingErrorImport) {\n // Get already imported error names\n const existingNamedImports = existingErrorImport\n .getNamedImports()\n .map((namedImport) => namedImport.getName());\n\n // Only import errors that aren't already imported\n const newErrorsToImport = errorClassNames.filter(\n (errorName) => !existingNamedImports.includes(errorName),\n );\n\n if (newErrorsToImport.length > 0) {\n // Add new named imports to existing import declaration\n existingErrorImport.addNamedImports(newErrorsToImport);\n }\n } else {\n // Create new import declaration\n this.importManager.addNamedImports(\n sourceFile,\n errorClassNames,\n errorImportPath,\n );\n }\n }\n }\n\n private getOutputPath(context: GenerationContext): string {\n return this.directoryManager.getReducerPath(\n context.rootDir,\n context.docModel.name,\n context.module.name,\n );\n }\n\n private createReducerObject(\n sourceFile: SourceFile,\n typeName: string,\n context: GenerationContext,\n ): void {\n const { operations, forceUpdate } = context;\n const operationHandlersObjectName = `${camelCase(context.docModel.name)}${pascalCase(context.module.name)}Operations`;\n const legacyReducerVar = sourceFile.getVariableDeclaration(\"reducer\");\n if (legacyReducerVar) {\n this.declarationManager.renameVariable(\n sourceFile,\n \"reducer\",\n operationHandlersObjectName,\n );\n }\n let reducerVar = sourceFile.getVariableDeclaration(\n operationHandlersObjectName,\n );\n if (!reducerVar) {\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: operationHandlersObjectName,\n type: typeName,\n initializer: \"{}\",\n },\n ],\n });\n reducerVar = sourceFile.getVariableDeclarationOrThrow(\n operationHandlersObjectName,\n );\n } else {\n // Ensure correct type\n const typeNode = reducerVar.getTypeNode();\n if (!typeNode || typeNode.getText() !== typeName) {\n reducerVar.setType(typeName);\n }\n }\n\n const initializer = reducerVar.getInitializerIfKindOrThrow(\n SyntaxKind.ObjectLiteralExpression,\n );\n\n for (const operation of operations) {\n this.addReducerMethod(initializer, operation, forceUpdate);\n }\n }\n\n private addReducerMethod(\n objectLiteral: ObjectLiteralExpression,\n operation: CodegenOperation,\n forceUpdate = false,\n ): void {\n const actionName = camelCase(operation.name ?? \"\");\n if (!actionName) return;\n\n const methodName = `${actionName}Operation`;\n\n const reducerCode = operation.reducer?.trim();\n\n const existingReducer = objectLiteral\n .getProperty(methodName)\n ?.asKind(SyntaxKind.MethodDeclaration);\n\n // if reducer already exists but forceUpdate is true, update it\n if (existingReducer) {\n if (forceUpdate && reducerCode) {\n existingReducer.setBodyText(\"\");\n this.setReducerMethodCode(existingReducer, reducerCode);\n }\n return;\n }\n\n // if reducer doesn't exist, create it and set the code with the default code if no code is provided\n const method = objectLiteral.addMethod({\n name: methodName,\n parameters: [{ name: \"state\" }, { name: \"action\" }],\n });\n this.setReducerMethodCode(method, reducerCode);\n }\n\n private setReducerMethodCode(reducer: MethodDeclaration, code?: string) {\n reducer.addStatements(\n code ? [code] : ReducerGenerator.getDefaultReducerCode(reducer.getName()),\n );\n }\n}\n","import type { SourceFile } from \"ts-morph\";\n\nexport class DeclarationManager {\n renameVariable(\n sourceFile: SourceFile,\n oldName: string,\n newName: string,\n ): void {\n const variable = sourceFile.getVariableDeclaration(oldName);\n\n if (variable) {\n variable.getNameNode().replaceWithText(newName);\n sourceFile.saveSync();\n }\n }\n}\n","import type { PHProjectDirectories } from \"@powerhousedao/codegen\";\nimport { kebabCase, pascalCase } from \"change-case\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport type { Project, SourceFile } from \"ts-morph\";\n\nexport class DirectoryManager {\n private directories: Required<PHProjectDirectories> = {\n documentModelDir: \"document-model\",\n editorsDir: \"editors\",\n processorsDir: \"processors\",\n subgraphsDir: \"subgraphs\",\n };\n\n constructor(directories: PHProjectDirectories = {}) {\n this.directories = {\n ...this.directories,\n ...directories,\n };\n }\n async ensureExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (err) {\n console.error(`Failed to create directory: ${dirPath}`, err);\n throw err;\n }\n }\n\n // Path builders for different file types\n getReducerPath(\n rootDir: string,\n docModelName: string,\n moduleName: string,\n ): string {\n return path.join(\n rootDir,\n this.directories.documentModelDir,\n kebabCase(docModelName),\n \"src\",\n \"reducers\",\n `${kebabCase(moduleName)}.ts`,\n );\n }\n\n getActionsPath(\n rootDir: string,\n docModelName: string,\n moduleName: string,\n ): string {\n return path.join(\n rootDir,\n this.directories.documentModelDir,\n kebabCase(docModelName),\n \"src\",\n \"actions\",\n `${kebabCase(moduleName)}.ts`,\n );\n }\n\n getComponentPath(\n rootDir: string,\n docModelName: string,\n componentName: string,\n ): string {\n return path.join(\n rootDir,\n this.directories.documentModelDir,\n kebabCase(docModelName),\n \"src\",\n \"components\",\n `${pascalCase(componentName)}.tsx`,\n );\n }\n\n getTypesPath(rootDir: string, docModelName: string): string {\n return path.join(\n rootDir,\n this.directories.documentModelDir,\n kebabCase(docModelName),\n \"src\",\n \"types.ts\",\n );\n }\n\n async createSourceFile(\n project: Project,\n filePath: string,\n ): Promise<SourceFile> {\n await this.ensureExists(path.dirname(filePath));\n return (\n project.addSourceFileAtPathIfExists(filePath) ??\n project.createSourceFile(filePath, \"\", { overwrite: false })\n );\n }\n}\n","import type { ImportDeclaration, SourceFile } from \"ts-morph\";\n\nexport interface ImportSpec {\n moduleSpecifier: string;\n namedImports?: string[];\n defaultImport?: string;\n isTypeOnly?: boolean;\n}\n\nexport class ImportManager {\n addImport(sourceFile: SourceFile, spec: ImportSpec): void {\n // Check if import already exists\n const existing = sourceFile.getImportDeclaration(\n (imp) => imp.getFullText() === spec.moduleSpecifier,\n );\n if (existing) {\n this.mergeImports(existing, spec);\n } else {\n sourceFile.addImportDeclaration(spec);\n }\n }\n\n addTypeImport(sourceFile: SourceFile, typeName: string, path: string): void {\n this.addImport(sourceFile, {\n moduleSpecifier: path,\n namedImports: [typeName],\n isTypeOnly: true,\n });\n }\n\n addNamedImports(\n sourceFile: SourceFile,\n imports: string[],\n path: string,\n ): void {\n this.addImport(sourceFile, {\n moduleSpecifier: path,\n namedImports: imports,\n });\n }\n\n private mergeImports(\n existingImport: ImportDeclaration,\n newSpec: ImportSpec,\n ): void {\n // Logic to merge named imports if they don't already exist\n if (newSpec.namedImports) {\n const existingNames = existingImport\n .getNamedImports()\n .map((ni) => ni.getName());\n const newNames = newSpec.namedImports.filter(\n (name) => !existingNames.includes(name),\n );\n\n if (newNames.length > 0) {\n existingImport.addNamedImports(newNames);\n }\n }\n }\n\n replaceImportByName(\n sourceFile: SourceFile,\n name: string,\n path: string,\n isTypeOnly = false,\n ): void {\n const existing = sourceFile\n .getImportDeclarations()\n .filter((imp) =>\n imp.getNamedImports().find((ni) => ni.getName() === name),\n );\n existing.forEach((imp) => imp.remove());\n sourceFile.addImportDeclaration({\n moduleSpecifier: path,\n namedImports: [name],\n isTypeOnly,\n });\n sourceFile.saveSync();\n }\n}\n","import type {\n DocumentModelGlobalState,\n ModuleSpecification,\n} from \"@powerhousedao/shared/document-model\";\nimport fs from \"fs/promises\";\nimport { Project } from \"ts-morph\";\nimport { DeclarationManager } from \"../utilities/DeclarationManager.js\";\nimport { DirectoryManager } from \"../utilities/DirectoryManager.js\";\nimport { ImportManager } from \"../utilities/ImportManager.js\";\nimport type { FileGenerator } from \"./FileGenerator.js\";\nimport type {\n CodeGeneratorOptions,\n CodegenOperation,\n GenerationContext,\n PHProjectDirectories,\n} from \"./GenerationContext.js\";\nimport { ReducerGenerator } from \"./ReducerGenerator.js\";\n\nexport class TSMorphCodeGenerator {\n private project = new Project();\n private generators = new Map<string, FileGenerator>();\n private directories: PHProjectDirectories = {\n documentModelDir: \"document-model\",\n editorsDir: \"editors\",\n processorsDir: \"processors\",\n subgraphsDir: \"subgraphs\",\n };\n private forceUpdate = false;\n\n constructor(\n private rootDir: string,\n private docModels: DocumentModelGlobalState[],\n private packageName: string,\n options: CodeGeneratorOptions = { directories: {}, forceUpdate: false },\n ) {\n this.directories = {\n ...this.directories,\n ...options.directories,\n };\n this.packageName = packageName;\n this.forceUpdate = options.forceUpdate ?? false;\n\n this.setupGenerators();\n }\n\n private setupGenerators(): void {\n const importManager = new ImportManager();\n const directoryManager = new DirectoryManager(this.directories);\n const declarationManager = new DeclarationManager();\n // Register all generators\n this.generators.set(\n \"reducers\",\n new ReducerGenerator(importManager, directoryManager, declarationManager),\n );\n }\n\n // Generate specific file types\n async generateReducers(): Promise<void> {\n await this.generateFileType(\"reducers\");\n }\n\n // Generate everything\n async generateAll(): Promise<void> {\n for (const [type] of this.generators) {\n await this.generateFileType(type);\n }\n }\n\n private async generateFileType(type: string): Promise<void> {\n const generator = this.generators.get(type);\n if (!generator) {\n throw new Error(`No generator registered for type: ${type}`);\n }\n\n await this.setupProject();\n\n for (const docModel of this.docModels) {\n const latestSpec =\n docModel.specifications[docModel.specifications.length - 1];\n\n for (const module of latestSpec.modules) {\n const context = this.createGenerationContext(\n docModel,\n module,\n this.forceUpdate,\n );\n\n await generator.generate(context);\n }\n }\n }\n\n private async setupProject(): Promise<void> {\n // Only load files from configured directories\n const sourcePaths: string[] = [];\n\n if (this.directories.documentModelDir) {\n const dirPath = `${this.rootDir}/${this.directories.documentModelDir}`;\n await this.ensureDirectoryExists(dirPath);\n sourcePaths.push(`${dirPath}/**/*.ts`);\n }\n if (this.directories.editorsDir) {\n const dirPath = `${this.rootDir}/${this.directories.editorsDir}`;\n await this.ensureDirectoryExists(dirPath);\n sourcePaths.push(`${dirPath}/**/*.ts`);\n }\n if (this.directories.processorsDir) {\n const dirPath = `${this.rootDir}/${this.directories.processorsDir}`;\n await this.ensureDirectoryExists(dirPath);\n sourcePaths.push(`${dirPath}/**/*.ts`);\n }\n if (this.directories.subgraphsDir) {\n const dirPath = `${this.rootDir}/${this.directories.subgraphsDir}`;\n await this.ensureDirectoryExists(dirPath);\n sourcePaths.push(`${dirPath}/**/*.ts`);\n }\n\n // Exclude node_modules from all paths\n sourcePaths.push(`!${this.rootDir}/**/node_modules/**`);\n\n if (sourcePaths.length > 0) {\n this.project.addSourceFilesAtPaths(sourcePaths);\n }\n }\n\n private createGenerationContext(\n docModel: DocumentModelGlobalState,\n module: ModuleSpecification,\n forceUpdate = false,\n ): GenerationContext {\n const operations: CodegenOperation[] = module.operations.map((op) => ({\n ...op,\n hasInput: op.schema !== null,\n scope: op.scope || \"global\",\n state: op.scope === \"global\" ? \"\" : op.scope,\n }));\n\n return {\n rootDir: this.rootDir,\n packageName: this.packageName,\n docModel,\n module,\n project: this.project,\n operations,\n forceUpdate,\n };\n }\n\n private async ensureDirectoryExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (err) {\n console.error(`Failed to create directory: ${dirPath}`, err);\n throw err;\n }\n }\n}\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GACe,MAChB,QAAQ,IAAI,SAAS,SAAS,uBAChC,EAAE,SAAS,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"index.mjs","names":["readdirSync","join","path","fs","fs","fs"],"sources":["../src/codegen/utils.ts","../src/codegen/features.ts","../src/codegen/generate.ts","../src/codegen/get-version.ts","../src/codegen/kysely.ts","../src/codegen/migrate.ts","../src/create-lib/checkout-project.ts","../src/create-lib/create-project.ts","../src/ts-morph-generator/core/FileGenerator.ts","../src/ts-morph-generator/core/ReducerGenerator.ts","../src/ts-morph-generator/utilities/DeclarationManager.ts","../src/ts-morph-generator/utilities/DirectoryManager.ts","../src/ts-morph-generator/utilities/ImportManager.ts","../src/ts-morph-generator/core/TSMorphCodeGenerator.ts"],"sourcesContent":["import type {\n DocumentModelDocument,\n DocumentModelGlobalState,\n} from \"@powerhousedao/shared/document-model\";\nimport { documentModelReducer } from \"@powerhousedao/shared/document-model\";\nimport { baseLoadFromFile } from \"document-model/node\";\nimport { readFile } from \"node:fs/promises\";\n\nexport function sortByKey<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).sort(([a], [b]) => a.localeCompare(b)),\n ) as T;\n}\n\nexport async function loadDocumentModel(\n path: string,\n): Promise<DocumentModelGlobalState> {\n let documentModel: DocumentModelGlobalState;\n try {\n if (!path) {\n throw new Error(\"Document model file not specified\");\n } else if (path.endsWith(\".zip\") || path.endsWith(\".phd\")) {\n const file = await baseLoadFromFile(path, documentModelReducer);\n documentModel = file.state.global;\n } else if (path.endsWith(\".json\")) {\n const data = await readFile(path, \"utf-8\");\n const parsedData = JSON.parse(data) as DocumentModelDocument;\n if (\"state\" in parsedData) {\n documentModel = parsedData.state.global;\n } else {\n documentModel = parsedData;\n }\n } else {\n throw new Error(\"File type not supported. Must be zip, phd, or json.\");\n }\n return documentModel;\n } catch (error) {\n throw (error as { code?: string }).code === \"MODULE_NOT_FOUND\"\n ? new Error(`Document model not found.`)\n : error;\n }\n}\n","import {\n ANALYTICS_ENGINE_CORE_PACKAGE,\n FEATURE_DEPENDENCIES,\n} from \"@powerhousedao/shared/clis\";\nimport { readdirSync, readFileSync, statSync } from \"fs\";\nimport { join } from \"path\";\nimport { type PackageJson, readPackage } from \"read-pkg\";\nimport { writePackage } from \"write-package\";\nimport { sortByKey } from \"./utils.js\";\n\nexport type Feature = keyof typeof FEATURE_DEPENDENCIES;\n\nfunction hasAnalyticsProcessor(processorsDir: string): boolean {\n const entries = readdirSync(processorsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const dir = join(processorsDir, entry.name);\n // processor.ts is the current shape; index.ts is the pre-migrate fallback.\n for (const filename of [\"processor.ts\", \"index.ts\"]) {\n try {\n const contents = readFileSync(join(dir, filename), \"utf-8\");\n if (contents.includes(ANALYTICS_ENGINE_CORE_PACKAGE)) return true;\n } catch {\n // file missing — try next candidate\n }\n }\n }\n return false;\n}\n\nexport function detectFeatures(projectDir: string): Feature[] {\n const features: Feature[] = [];\n const processorsDir = join(projectDir, \"processors\");\n const processorsStat = statSync(processorsDir, { throwIfNoEntry: false });\n if (processorsStat?.isDirectory() && hasAnalyticsProcessor(processorsDir)) {\n features.push(\"analyticsProcessor\");\n }\n return features;\n}\n\n// Idempotently adds the peer + dev deps required by `features` to the\n// project's package.json. Reuses the existing `document-model` pin as the\n// version anchor for new workspace peers so generated entries stay in sync\n// with whatever migrate last wrote. No-op if the entries are already present.\nexport async function syncFeatureDependencies(\n features: readonly Feature[],\n projectDir: string,\n): Promise<void> {\n if (features.length === 0) return;\n\n const packageJson = await readPackage({ cwd: projectDir, normalize: false });\n\n const pinVersion =\n packageJson.peerDependencies?.[\"document-model\"] ??\n packageJson.devDependencies?.[\"document-model\"];\n if (!pinVersion) {\n throw new Error(\n \"Cannot sync feature dependencies: project is missing `document-model` in peer/devDependencies. Run `ph migrate` first.\",\n );\n }\n\n const peerDependencies = {\n ...(packageJson.peerDependencies ?? {}),\n } as Record<string, string>;\n const devDependencies = {\n ...(packageJson.devDependencies ?? {}),\n } as Record<string, string>;\n\n const added: string[] = [];\n for (const feature of features) {\n const spec = FEATURE_DEPENDENCIES[feature];\n for (const pkg of spec.peerVersioned) {\n if (peerDependencies[pkg] === undefined) {\n peerDependencies[pkg] = pinVersion;\n added.push(pkg);\n }\n if (devDependencies[pkg] === undefined) {\n devDependencies[pkg] = pinVersion;\n }\n }\n const peerExternal = spec.peerExternal as Record<\n string,\n { peer: string; dev: string }\n >;\n for (const [pkg, versionSpec] of Object.entries(peerExternal)) {\n if (peerDependencies[pkg] === undefined) {\n peerDependencies[pkg] = versionSpec.peer;\n added.push(pkg);\n }\n if (devDependencies[pkg] === undefined) {\n devDependencies[pkg] = versionSpec.dev;\n }\n }\n }\n\n if (added.length === 0) return;\n\n const updated = {\n ...packageJson,\n peerDependencies: sortByKey(peerDependencies),\n devDependencies: sortByKey(devDependencies),\n } as PackageJson;\n await writePackage(projectDir, updated);\n console.log(`Added peer/dev dependencies: ${added.join(\", \")}`);\n}\n","import { type DocumentModelGlobalState } from \"@powerhousedao/shared/document-model\";\nimport type { ProcessorApps } from \"@powerhousedao/shared/processors\";\nimport { kebabCase } from \"change-case\";\nimport {\n pruneManifestSection,\n tsMorphGenerateApp,\n tsMorphGenerateDocumentEditor,\n tsMorphGenerateDocumentModel,\n tsMorphGenerateProcessor,\n tsMorphGenerateSubgraph,\n} from \"file-builders\";\nimport { readdirSync } from \"node:fs\";\nimport {\n filter,\n isDefined,\n isIncludedIn,\n isTruthy,\n map,\n pipe,\n prop,\n unique,\n} from \"remeda\";\nimport type { Project } from \"ts-morph\";\nimport {\n getAppMetadata,\n getEditorMetadata,\n getOrCreateDirectory,\n getProcessorMetadata,\n getSubgraphMetadata,\n loadDocumentModelInDir,\n} from \"utils\";\nimport { loadDocumentModel } from \"./utils.js\";\n\nexport async function generateDocumentModel(\n documentModelState: DocumentModelGlobalState,\n project: Project,\n) {\n await tsMorphGenerateDocumentModel(documentModelState, project);\n}\n\n/* Runs generate for each document model json file found in the project's `document-models` directory */\nexport async function generateAllDocumentModels(project: Project) {\n const { directory: documentModelsDir } = getOrCreateDirectory(\n project,\n \"document-models\",\n );\n const documentModelsDirPath = documentModelsDir.getPath();\n const projectDir = documentModelsDir.getParentOrThrow().getPath();\n const documentModelStateFiles = pipe(\n readdirSync(documentModelsDirPath, { withFileTypes: true }),\n map(loadDocumentModelInDir),\n filter(isDefined),\n );\n\n for (const documentModelState of documentModelStateFiles) {\n await generateDocumentModel(documentModelState, project);\n }\n\n await pruneManifestSection(\n projectDir,\n \"documentModels\",\n documentModelStateFiles.map((s) => s.id),\n );\n}\nexport async function generateFromFile(filePath: string, project: Project) {\n // load document model spec from file\n const documentModelState = await loadDocumentModel(filePath);\n\n // delegate to shared generation function\n await generateDocumentModel(documentModelState, project);\n}\n\ntype GenerateEditorArgs = {\n editorName: string;\n documentTypes: string[];\n editorId?: string;\n editorDirName?: string;\n};\nexport async function generateEditor(\n args: GenerateEditorArgs,\n project: Project,\n) {\n const {\n editorName,\n documentTypes,\n editorId: editorIdArg,\n editorDirName,\n } = args;\n\n if (documentTypes.length > 1) {\n throw new Error(\"Multiple document types are not supported yet\");\n }\n\n const documentModelId = documentTypes[0];\n const editorId = editorIdArg || kebabCase(editorName);\n const editorDir = editorDirName || kebabCase(editorName);\n\n await tsMorphGenerateDocumentEditor({\n project,\n editorDir,\n documentModelId,\n editorName,\n editorId,\n });\n}\n\n/* Runs generate for all editors found in the project's `editors` directory.\n * Note: we intentionally filter out editors with the document type \"powerhouse/document-drive\".\n * These are handled separately by the `generateAllApps` function.\n */\nexport async function generateAllEditors(project: Project) {\n const { directory: editorsDir } = getOrCreateDirectory(project, \"editors\");\n const projectDir = editorsDir.getParentOrThrow().getPath();\n\n /* An editor's `id`, `name`, and `documentTypes` args can be found in the `module.ts` file */\n const editorsToAdd = pipe(\n editorsDir.getDirectories(),\n map((dir) => dir.getBaseName()),\n map((dirName) => getEditorMetadata(project, dirName)),\n filter(isTruthy),\n filter(\n ({ documentTypes }) =>\n !isIncludedIn(\"powerhouse/document-drive\", documentTypes),\n ),\n );\n\n for (const editorToAdd of editorsToAdd) {\n const {\n name: editorName,\n id: editorId,\n dirName: editorDirName,\n documentTypes,\n } = editorToAdd;\n\n await generateEditor(\n {\n editorName,\n editorId,\n editorDirName,\n documentTypes,\n },\n project,\n );\n }\n\n await pruneManifestSection(\n projectDir,\n \"editors\",\n editorsToAdd.map((e) => e.id),\n );\n}\n\ntype GenerateAppArgs = {\n appName: string;\n appId?: string;\n allowedDocumentTypes?: string[];\n isDragAndDropEnabled?: boolean;\n appDirName?: string;\n};\nexport async function generateApp(args: GenerateAppArgs, project: Project) {\n const {\n appName,\n appId,\n allowedDocumentTypes,\n isDragAndDropEnabled,\n appDirName,\n } = args;\n\n await tsMorphGenerateApp({\n project,\n editorDir: appDirName || kebabCase(appName),\n editorName: appName,\n editorId: appId ?? kebabCase(appName),\n allowedDocumentModelIds: allowedDocumentTypes ?? [],\n isDragAndDropEnabled: isDragAndDropEnabled ?? true,\n });\n}\n\n/* Runs generate for all apps found in the project's `editors` directory.\n * Note: we intentionally filter out editors which do not have the document type \"powerhouse/document-drive\".\n * These are handled separately by the `generateAllEditors` function.\n */\nexport async function generateAllApps(project: Project) {\n const { directory: editorsDir } = getOrCreateDirectory(project, \"editors\");\n const projectDir = editorsDir.getParentOrThrow().getPath();\n\n /* An editor's `id`, `name`, and `documentTypes` args can be found in the `module.ts` file */\n const appsToAdd = pipe(\n editorsDir.getDirectories(),\n map((dir) => dir.getBaseName()),\n map((dirName) => getAppMetadata(project, dirName)),\n filter(isTruthy),\n );\n\n for (const appToAdd of appsToAdd) {\n const {\n name: appName,\n id: appId,\n dirName: appDirName,\n allowedDocumentTypes,\n isDragAndDropEnabled,\n } = appToAdd;\n await generateApp(\n {\n appName,\n appDirName,\n appId,\n allowedDocumentTypes,\n isDragAndDropEnabled,\n },\n project,\n );\n }\n\n await pruneManifestSection(\n projectDir,\n \"apps\",\n appsToAdd.map((a) => a.id),\n );\n}\nexport async function generateSubgraph(subgraphName: string, project: Project) {\n await tsMorphGenerateSubgraph({ subgraphName, project });\n}\n\n/* Runs generate for each directory found in the project's `subgraphs` directory */\nexport async function generateAllSubgraphs(project: Project) {\n const { directory: subgraphsDir } = getOrCreateDirectory(\n project,\n \"subgraphs\",\n );\n const projectDir = subgraphsDir.getParentOrThrow().getPath();\n /* The subgraph's name is found in the `index.ts` file */\n const subgraphNames = pipe(\n subgraphsDir.getDirectories(),\n map((dir) => dir.getBaseName()),\n map((dirName) => getSubgraphMetadata(project, dirName)),\n map(prop(\"subgraphName\")),\n filter(isDefined),\n unique(),\n );\n for (const subgraphName of subgraphNames) {\n await generateSubgraph(subgraphName, project);\n }\n\n await pruneManifestSection(\n projectDir,\n \"subgraphs\",\n subgraphNames.map((name) => kebabCase(name)),\n );\n}\n\nexport async function generateProcessor(\n args: {\n processorName: string;\n processorType: \"analytics\" | \"relationalDb\";\n processorApps: ProcessorApps;\n documentTypes: string[];\n },\n project: Project,\n) {\n return await tsMorphGenerateProcessor({\n project,\n ...args,\n });\n}\n\n/* Runs generate for each directory found in the project's `processors` directory */\nexport async function generateAllProcessors(project: Project) {\n const { directory: processorsDir } = getOrCreateDirectory(\n project,\n \"processors\",\n );\n const projectDir = processorsDir.getParentOrThrow().getPath();\n const processorsToGenerate = pipe(\n processorsDir.getDirectories(),\n map((dir) => dir.getBaseName()),\n map((dirName) => getProcessorMetadata(project, dirName)),\n );\n\n for (const processorArgs of processorsToGenerate) {\n await generateProcessor(processorArgs, project);\n }\n\n await pruneManifestSection(\n projectDir,\n \"processors\",\n processorsToGenerate.map((p) => kebabCase(p.processorName)),\n );\n}\n\n/* Runs each module type's generateAll{moduleType} function for the current project */\nexport async function generateAll(project: Project) {\n await generateAllDocumentModels(project);\n await generateAllEditors(project);\n await generateAllApps(project);\n await generateAllSubgraphs(project);\n await generateAllProcessors(project);\n}\n","declare const CODEGEN_VERSION: string | undefined;\n\nexport function getCodegenVersion(): string {\n if (typeof CODEGEN_VERSION !== \"undefined\") return CODEGEN_VERSION;\n return (\n process.env.WORKSPACE_VERSION ||\n process.env.npm_package_version ||\n \"unknown\"\n );\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join, resolve } from \"node:path\";\n\nfunction getKyselyPgLiteBin(): string {\n const require = createRequire(import.meta.url);\n\n const paths = require.resolve.paths(\"kysely-pglite\");\n if (paths) {\n for (const basePath of paths) {\n const pkgRoot = join(basePath, \"kysely-pglite\");\n const binPath = join(pkgRoot, \"bin/run.js\");\n\n if (existsSync(binPath)) {\n return binPath;\n }\n }\n }\n\n throw new Error(\"Could not find kysely-pglite/bin/run.js\");\n}\n\nexport interface IOptions {\n migrationFile: string;\n schemaFile?: string;\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd?: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: \"inherit\",\n shell: true,\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n });\n}\n\nexport async function generateDBSchema({\n migrationFile,\n schemaFile,\n}: IOptions) {\n const outFile = schemaFile ?? resolve(migrationFile, \"../schema.ts\");\n\n try {\n const kyselyBinPath = getKyselyPgLiteBin();\n // Use kysely-pglite CLI to handle TypeScript compilation and module resolution\n await runCommand(\n \"node\",\n [kyselyBinPath, migrationFile, \"--outFile\", outFile],\n process.cwd(),\n );\n\n console.log(`Schema types generated at ${outFile}`);\n } catch (error) {\n console.error(\"Error running migration:\", error);\n }\n}\n","import {\n externalDevDependencies,\n FEATURE_DEPENDENCIES,\n getPackageManagerAtPowerhouseProjectDirPath,\n getPowerhouseProjectInstallCommand,\n LEGACY_LINT_FORMAT_DEPENDENCIES,\n LEGACY_LINT_FORMAT_FILES,\n packageJsonExports,\n packageScripts,\n PEER_EXTERNAL_DEPENDENCIES,\n runCmd,\n VERSIONED_DEV_DEPENDENCIES,\n VERSIONED_PEER_DEPENDENCIES,\n} from \"@powerhousedao/shared/clis\";\nimport console from \"console\";\nimport { writeAllGeneratedProjectFiles } from \"file-builders\";\nimport { cpSync, mkdirSync, readdirSync, rmSync, statSync } from \"fs\";\nimport npmFetch from \"npm-registry-fetch\";\nimport { join } from \"path\";\nimport { type PackageJson, readPackage } from \"read-pkg\";\nimport {\n filter,\n fromKeys,\n isTruthy,\n keys,\n map,\n mapValues,\n merge,\n omit,\n pipe,\n prop,\n} from \"remeda\";\nimport type { Project } from \"ts-morph\";\nimport { buildTsMorphProject, fixGenerateMockImports } from \"utils\";\nimport { writePackage } from \"write-package\";\nimport { detectFeatures } from \"./features.js\";\nimport { generateAll } from \"./generate.js\";\nimport { sortByKey } from \"./utils.js\";\n\n// Anchor dist-tag resolution to ph-cli. Releases publish in topological order\n// (releaseGraph), so ph-cli — a top-level consumer — is published *after* its\n// workspace dependencies, and a dist-tag only moves once that package is\n// published. Resolving the tag against ph-cli therefore yields a version whose\n// entire workspace dependency closure is already on the registry. Anchoring to\n// an arbitrary `WORKSPACE_PACKAGES[0]` (e.g. codegen) instead races during the\n// publish window: codegen@dev.N can be tagged before ph-cli@dev.N exists, so\n// pinning every workspace dep to that version makes `pnpm i` fail with\n// ERR_PNPM_NO_MATCHING_VERSION. This matches the anchor the ph-cli migrate\n// command already uses (clis/ph-cli/src/services/migrate.ts).\nconst VERSION_ANCHOR_PACKAGE = \"@powerhousedao/ph-cli\";\n\n/* Uses the npm cli's fetch function to get the version for a specified tag */\nexport async function getFullyQualifiedWorkspacePackageVersion(\n versionOrTag: string,\n) {\n const isTag =\n versionOrTag === \"latest\" ||\n versionOrTag === \"staging\" ||\n versionOrTag === \"dev\";\n\n if (!isTag) return versionOrTag;\n const anchorPackageName =\n WORKSPACE_PACKAGES.find(\n (pkg) => pkg.manifest.name === VERSION_ANCHOR_PACKAGE,\n )?.manifest.name ?? WORKSPACE_PACKAGES[0].manifest.name!;\n const result = (await npmFetch.json(anchorPackageName)) as {\n \"dist-tags\": Record<\"latest\" | \"staging\" | \"dev\", string>;\n };\n return result[\"dist-tags\"][versionOrTag];\n}\n\nexport function fixLegacyImportPaths(\n project: Project,\n packageName: string | undefined,\n) {\n if (!packageName) {\n console.error(\"No package name found in package.json.\");\n return;\n }\n const sourceFiles = project.getSourceFiles();\n for (const sourceFile of sourceFiles) {\n const importStatements = sourceFile.getImportDeclarations();\n for (const importStatement of importStatements) {\n const moduleSpecifier = importStatement.getModuleSpecifier();\n const moduleSpecifierText = moduleSpecifier.getLiteralText();\n // remove usage of the old `package-name/` style paths\n if (moduleSpecifierText.includes(packageName)) {\n moduleSpecifier.setLiteralValue(\n moduleSpecifierText.replace(`${packageName}/`, \"\"),\n );\n }\n // attempt to fix absolute import paths for document models like `../../../document-models/model/something/something.js`\n // these don't work anymore with the versioned document models, since the absolute file paths are different\n const match = moduleSpecifierText.match(\n /^(\\.\\.\\/)+document-models\\/([^/]+)(?!\\/v\\d+(?:\\/|$))(?:\\/.*)?$/,\n );\n\n if (match) {\n moduleSpecifier.setLiteralValue(`document-models/${match[2]}`);\n }\n }\n fixGenerateMockImports(sourceFile);\n }\n}\n\nfunction isProtectedVersionSpec(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n (value.startsWith(\"workspace:\") || value.startsWith(\"catalog:\"))\n );\n}\n\n// Keeps user-declared `workspace:*` / `catalog:` refs intact when the caller\n// would otherwise replace them with a hard pin during migration.\nfunction preserveProtected(\n newValues: Record<string, string>,\n existingSources: ReadonlyArray<\n Partial<Record<string, string | undefined>> | undefined\n >,\n): Record<string, string> {\n const result: Record<string, string> = { ...newValues };\n for (const key of Object.keys(newValues)) {\n for (const source of existingSources) {\n const existing = source?.[key];\n if (isProtectedVersionSpec(existing)) {\n result[key] = existing;\n break;\n }\n }\n }\n return result;\n}\n\nexport async function migrate(version: string, projectDir = process.cwd()) {\n const fullyQualifiedVersion =\n await getFullyQualifiedWorkspacePackageVersion(version);\n\n const packageJson = await readPackage({\n cwd: projectDir,\n normalize: false,\n });\n const exports = packageJsonExports;\n const scripts = merge(packageJson.scripts, packageScripts);\n const workspacePackageNames = filter(\n map(WORKSPACE_PACKAGES, prop(\"manifest\", \"name\")),\n isTruthy,\n );\n\n const features = detectFeatures(projectDir);\n const featurePeerVersioned = features.flatMap(\n (f) => FEATURE_DEPENDENCIES[f].peerVersioned as readonly string[],\n );\n const featurePeerExternal = features.reduce<\n Record<string, { peer: string; dev: string }>\n >((acc, f) => ({ ...acc, ...FEATURE_DEPENDENCIES[f].peerExternal }), {});\n\n const managedPeerVersioned = [\n ...VERSIONED_PEER_DEPENDENCIES,\n ...featurePeerVersioned,\n ];\n const managedPeerNames = [\n ...managedPeerVersioned,\n ...keys(PEER_EXTERNAL_DEPENDENCIES),\n ...keys(featurePeerExternal),\n ];\n const managedDevVersioned = [\n ...VERSIONED_DEV_DEPENDENCIES,\n ...managedPeerVersioned,\n ];\n const managedDevNames = [\n ...managedDevVersioned,\n ...keys(externalDevDependencies),\n ...keys(featurePeerExternal),\n ];\n\n const peerExternals = {\n ...mapValues(PEER_EXTERNAL_DEPENDENCIES, (v) => v.peer),\n ...mapValues(featurePeerExternal, (v) => v.peer),\n };\n const peerDevPins = {\n ...mapValues(PEER_EXTERNAL_DEPENDENCIES, (v) => v.dev),\n ...mapValues(featurePeerExternal, (v) => v.dev),\n };\n\n const existingDepSources = [\n packageJson.dependencies,\n packageJson.devDependencies,\n packageJson.peerDependencies,\n ];\n\n const peerDependencies = pipe(\n packageJson.peerDependencies ?? {},\n omit([...managedDevNames, ...LEGACY_LINT_FORMAT_DEPENDENCIES]),\n merge(\n preserveProtected(\n {\n ...fromKeys(managedPeerVersioned, () => fullyQualifiedVersion),\n ...peerExternals,\n },\n existingDepSources,\n ),\n ),\n mapValues((value, key) =>\n isProtectedVersionSpec(value)\n ? value\n : workspacePackageNames.includes(key)\n ? fullyQualifiedVersion\n : value,\n ),\n sortByKey,\n );\n\n const devDependencies = pipe(\n merge(packageJson.dependencies ?? {}, packageJson.devDependencies ?? {}),\n omit([...managedPeerNames, ...LEGACY_LINT_FORMAT_DEPENDENCIES]),\n merge(\n preserveProtected(\n {\n ...fromKeys(managedDevVersioned, () => fullyQualifiedVersion),\n ...externalDevDependencies,\n ...peerDevPins,\n },\n existingDepSources,\n ),\n ),\n mapValues((value, key) =>\n isProtectedVersionSpec(value)\n ? value\n : workspacePackageNames.includes(key)\n ? fullyQualifiedVersion\n : value,\n ),\n sortByKey,\n );\n\n console.log(\"Updating package.json...\");\n const updatedPackageJson: PackageJson = {\n ...packageJson,\n type: packageJson.type ?? \"module\",\n sideEffects: packageJson.sideEffects ?? false,\n files: packageJson.files ?? [\"/dist\"],\n exports,\n scripts,\n peerDependencies,\n devDependencies,\n } as PackageJson;\n // Runtime `dependencies` block is no longer emitted — the bundled dist\n // self-contains everything except the declared peers.\n delete (updatedPackageJson as { dependencies?: unknown }).dependencies;\n await writePackage(projectDir, updatedPackageJson);\n\n console.log(\"Removing legacy lint/format config files...\");\n removeLegacyLintFormatFiles(projectDir);\n console.log(\"Overwriting project root files...\");\n await writeAllGeneratedProjectFiles(projectDir);\n console.log(\"Moving unversioned document models...\");\n moveLegacyDocumentModels(projectDir);\n const project = buildTsMorphProject(projectDir);\n console.log(\"Fixing legacy import paths...\");\n fixLegacyImportPaths(project, packageJson.name);\n console.log(\"Installing dependencies...\");\n await installProjectDependencies(projectDir);\n console.log(\"Re-generating code...\");\n await generateAll(project);\n await project.save();\n}\n\nfunction removeLegacyLintFormatFiles(projectDir: string) {\n for (const name of LEGACY_LINT_FORMAT_FILES) {\n rmSync(join(projectDir, name), { force: true });\n }\n}\n\nasync function installProjectDependencies(projectDir: string) {\n const agent = await getPackageManagerAtPowerhouseProjectDirPath(projectDir);\n if (!agent) {\n throw new Error(\n \"Failed to detect your package manager. Run install manually.\",\n );\n }\n const installCommand = await getPowerhouseProjectInstallCommand(agent);\n console.log(`Installing dependencies with \\`${agent}\\``);\n runCmd(installCommand, { cwd: projectDir });\n}\n\nfunction moveLegacyDocumentModels(projectDir: string) {\n const fileNamesToDelete = [\n \"actions.ts\",\n \"hooks.ts\",\n \"module.ts\",\n \"index.ts\",\n \"utils.ts\",\n \"schema.graphql\",\n ];\n const dirNamesToCopy = [\"src\", \"gen\"];\n const dirs = pipe(\n readdirSync(join(projectDir, \"document-models\"), { withFileTypes: true }),\n filter((entry) => entry.isDirectory()),\n filter(\n (dir) =>\n statSync(join(dir.parentPath, dir.name, `${dir.name}.json`), {\n throwIfNoEntry: false,\n })?.isFile() ?? false,\n ),\n map((dir) => join(dir.parentPath, dir.name)),\n );\n\n for (const dirPath of dirs) {\n for (const name of fileNamesToDelete) {\n const filePath = join(dirPath, name);\n rmSync(filePath, { force: true });\n }\n const versionDirPath = join(dirPath, \"v1\");\n const versionDirExists =\n statSync(versionDirPath, { throwIfNoEntry: false })?.isDirectory() ??\n false;\n if (!versionDirExists) {\n mkdirSync(versionDirPath);\n }\n for (const dirName of dirNamesToCopy) {\n const srcDirPath = join(dirPath, dirName);\n const srcDirExists =\n statSync(srcDirPath, { throwIfNoEntry: false })?.isDirectory() ?? false;\n if (!srcDirExists) continue;\n const destDirPath = join(versionDirPath, dirName);\n cpSync(srcDirPath, destDirPath, {\n recursive: true,\n force: false,\n errorOnExist: false,\n });\n rmSync(srcDirPath, {\n force: true,\n recursive: true,\n });\n }\n }\n}\n","import path from \"node:path\";\nimport { runCmd } from \"@powerhousedao/shared/clis\";\n/**\n * Clones a git repository and returns the path to the cloned project.\n * @param repositoryUrl - The URL of the git repository to clone\n * @returns The absolute path to the cloned project directory\n */\nexport function cloneRepository(repositoryUrl: string): string {\n try {\n console.log(\n \"\\x1b[33m\",\n `Cloning repository from ${repositoryUrl}...`,\n \"\\x1b[0m\",\n );\n runCmd(`git clone ${repositoryUrl}`);\n\n // Extract project name from repository URL\n // e.g., https://github.com/org/repo.git -> repo\n const repoName = repositoryUrl\n .split(\"/\")\n .pop()\n ?.replace(/\\.git$/, \"\");\n\n if (!repoName) {\n throw new Error(\"Could not determine project name from repository URL\");\n }\n\n const projectPath = path.join(process.cwd(), repoName);\n return projectPath;\n } catch (error) {\n console.log(error);\n throw error;\n }\n}\n\n/**\n * Installs dependencies in a project directory using the specified package manager.\n * @param projectPath - The absolute path to the project directory\n * @param packageManager - The package manager to use (npm, pnpm, yarn, bun)\n */\nexport function installDependencies(\n projectPath: string,\n packageManager: string,\n): void {\n try {\n process.chdir(projectPath);\n\n console.log(\n \"\\x1b[34m\",\n `Installing dependencies with ${packageManager}...`,\n \"\\x1b[0m\",\n );\n const extra =\n packageManager === \"pnpm\" ? \" --config.minimum-release-age=0\" : \"\";\n runCmd(`${packageManager} install --loglevel error${extra}`);\n\n console.log(\"\\x1b[32m\", \"Dependencies installed successfully!\", \"\\x1b[0m\");\n console.log();\n } catch (error) {\n console.log(error);\n throw error;\n }\n}\n","import { runCmd, writeFileEnsuringDir } from \"@powerhousedao/shared/clis\";\nimport chalk from \"chalk\";\nimport fs from \"node:fs\";\nimport path from \"path\";\nimport { gitIgnoreTemplate } from \"templates\";\nimport { runOxfmt } from \"utils\";\nimport {\n applyProjectCustomizations,\n writeAllGeneratedProjectFiles,\n writeProjectRootFiles,\n} from \"file-builders\";\n\n// Install recipes for `--clone`. Only managers with a cache-miss-fails\n// offline mode are listed; yarn needs an opt-in offline mirror and bun has\n// no real offline mode (https://github.com/oven-sh/bun/issues/7956).\ntype CloneRecipe = { lockfile: string; install: string };\nconst CLONE_RECIPES: Record<string, CloneRecipe | undefined> = {\n pnpm: {\n lockfile: \"pnpm-lock.yaml\",\n install: \"pnpm install --frozen-lockfile --offline\",\n },\n npm: {\n lockfile: \"package-lock.json\",\n install: \"npm ci --offline\",\n },\n};\n\ntype CreateProjectArgs = {\n name: string;\n packageManager: string;\n tag?: string;\n version?: string;\n remoteDrive?: string;\n skipGitInit?: boolean;\n skipInstall?: boolean;\n /**\n * Path to an existing scaffolded project to clone instead of generating +\n * resolving deps from scratch. The clone's source + pnpm-lock.yaml are\n * copied (node_modules is not — it's rebuilt from the lockfile via the warm\n * pnpm store with `pnpm install --frozen-lockfile --offline`). Requires\n * packageManager === \"pnpm\".\n */\n clone?: string;\n};\nexport async function createProject({\n name,\n packageManager,\n tag,\n version,\n remoteDrive,\n skipGitInit,\n skipInstall,\n clone,\n}: CreateProjectArgs) {\n const appPath = path.join(process.cwd(), name);\n\n if (fs.existsSync(appPath)) {\n throw new Error(\n `⛔ The folder \"${name}\" already exists in the current directory, please give it another name.`,\n );\n }\n\n if (clone) {\n await createProjectFromClone({\n name,\n appPath,\n clone,\n packageManager,\n skipGitInit,\n skipInstall,\n remoteDrive,\n });\n return;\n }\n\n // Create a new directory for the project\n console.log(chalk.blue(`▶️ Creating directory for project \"${name}\"...\\n`));\n fs.mkdirSync(appPath);\n process.chdir(appPath);\n console.log(chalk.green(`✅ Project directory created\\n`));\n\n await writeFileEnsuringDir(\".gitignore\", gitIgnoreTemplate);\n if (!skipGitInit) {\n // Create a .gitignore file, then initialize the git repository\n console.log(chalk.blue(`▶️ Initializing git repository...\\n`));\n runCmd(`git init`);\n console.log(chalk.green(`\\n✅ Git repository initialized\\n`));\n }\n\n // Write the boilerplate files for the project\n console.log(chalk.blue(`▶️ Creating project boilerplate files...\\n`));\n await writeProjectRootFiles({\n name,\n tag,\n version,\n remoteDrive,\n packageManager,\n });\n await writeAllGeneratedProjectFiles();\n // Must run last: it rewrites `.mcp.json` / `.cursor/mcp.json`, which\n // `writeAllGeneratedProjectFiles` has only just created.\n await applyProjectCustomizations({ name, projectDir: appPath, remoteDrive });\n console.log(chalk.green(`✅ Project boilerplate files created\\n`));\n\n if (!skipInstall) {\n // Install the project dependencies with the specified package manager\n console.log(\n chalk.blue(\n `▶️ Installing project dependencies with ${packageManager}...\\n`,\n ),\n );\n const extra =\n packageManager === \"pnpm\" ? \" --config.minimum-release-age=0\" : \"\";\n runCmd(`${packageManager} install${extra}`);\n console.log(chalk.green(`\\n✅ Project dependencies installed\\n`));\n }\n\n // Use the installed version of `oxfmt` to format the generated code\n console.log(chalk.blue(`▶️ Formatting boilerplate project files...\\n`));\n await runOxfmt();\n console.log(chalk.green(`✅ Boilerplate files formatted\\n`));\n\n // Project creation complete\n console.log(chalk.bold(`🎉 Successfully created project \"${name}\" 🎉\\n`));\n}\n\n/**\n * Fast path for `ph init --clone <path>`: copy an already-scaffolded project's\n * source + lockfile (NOT node_modules), re-apply the per-project\n * customizations, then rebuild node_modules with\n * `pnpm install --frozen-lockfile --offline`. pnpm materializes the tree from\n * the warm store via clone/hardlink — far faster and ~0 extra disk vs a fresh\n * resolve+install, and the lockfile guarantees an identical dependency set.\n * Requires the cloned project's packages to be present in the local pnpm\n * store (which is the case in an image where the source was scaffolded at\n * build).\n */\nasync function createProjectFromClone(args: {\n name: string;\n appPath: string;\n clone: string;\n packageManager: string;\n skipGitInit?: boolean;\n skipInstall?: boolean;\n remoteDrive?: string;\n}) {\n const {\n name,\n appPath,\n clone,\n packageManager,\n skipGitInit,\n skipInstall,\n remoteDrive,\n } = args;\n // --clone needs a package manager with a hard-offline install mode that\n // refuses to hit the network on a cache miss. pnpm and npm qualify; yarn\n // and bun do not (bun has no offline flag at all — cache misses silently\n // re-fetch).\n const recipe = CLONE_RECIPES[packageManager];\n if (!recipe) {\n throw new Error(\n `⛔ --clone is only compatible with --pnpm or --npm (got \"${packageManager}\").`,\n );\n }\n const clonePath = path.resolve(process.cwd(), clone);\n if (!fs.existsSync(clonePath) || !fs.statSync(clonePath).isDirectory()) {\n throw new Error(\n `⛔ Clone source \"${clone}\" not found (resolved to \"${clonePath}\"). Pass a path to an existing scaffolded project.`,\n );\n }\n if (!fs.existsSync(path.join(clonePath, recipe.lockfile))) {\n throw new Error(\n `⛔ Clone source \"${clone}\" has no ${recipe.lockfile}. --clone with --${packageManager} requires a committed lockfile.`,\n );\n }\n\n // Copy source + lockfile only; node_modules is rebuilt from the store below,\n // and the source's .git is irrelevant (we re-init fresh).\n console.log(chalk.blue(`▶️ Cloning project from \"${clone}\"...\\n`));\n fs.cpSync(clonePath, appPath, {\n recursive: true,\n filter: (src) => {\n const base = path.basename(src);\n // Skip deps (rebuilt from the lockfile), git history (re-init'd), and\n // build artifacts (regenerated) so the new project starts clean.\n return (\n base !== \"node_modules\" &&\n base !== \".git\" &&\n base !== \"dist\" &&\n !base.endsWith(\".tsbuildinfo\")\n );\n },\n });\n console.log(chalk.green(`✅ Project files cloned\\n`));\n\n if (!skipGitInit) {\n console.log(chalk.blue(`▶️ Initializing git repository...\\n`));\n runCmd(`git init`, { cwd: appPath });\n console.log(chalk.green(`\\n✅ Git repository initialized\\n`));\n }\n\n console.log(chalk.blue(`▶️ Applying project customizations...\\n`));\n await applyProjectCustomizations({ name, projectDir: appPath, remoteDrive });\n console.log(chalk.green(`✅ Project customizations applied\\n`));\n\n if (!skipInstall) {\n // Rebuild node_modules from the lockfile, offline, via the warm cache.\n console.log(\n chalk.blue(`▶️ Installing dependencies from lockfile (offline)...\\n`),\n );\n runCmd(recipe.install, { cwd: appPath });\n console.log(chalk.green(`\\n✅ Dependencies installed from lockfile\\n`));\n }\n\n console.log(\n chalk.bold(`🎉 Successfully cloned project \"${name}\" from \"${clone}\" 🎉\\n`),\n );\n}\n","import type { DeclarationManager } from \"../utilities/DeclarationManager.js\";\nimport type { DirectoryManager } from \"../utilities/DirectoryManager.js\";\nimport type { ImportManager } from \"../utilities/ImportManager.js\";\nimport type { GenerationContext } from \"./GenerationContext.js\";\n\nexport abstract class FileGenerator {\n constructor(\n protected importManager: ImportManager,\n protected directoryManager: DirectoryManager,\n protected declarationManager: DeclarationManager,\n ) {}\n\n abstract generate(context: GenerationContext): Promise<void>;\n}\n","import { camelCase, kebabCase, pascalCase } from \"change-case\";\nimport type { OperationErrorSpecification } from \"@powerhousedao/shared/document-model\";\nimport type {\n MethodDeclaration,\n ObjectLiteralExpression,\n SourceFile,\n} from \"ts-morph\";\nimport { SyntaxKind, VariableDeclarationKind } from \"ts-morph\";\nimport { FileGenerator } from \"./FileGenerator.js\";\nimport type {\n CodegenOperation,\n GenerationContext,\n} from \"./GenerationContext.js\";\n\nexport class ReducerGenerator extends FileGenerator {\n async generate(context: GenerationContext): Promise<void> {\n // Skip if no actions to generate\n if (context.operations.length === 0) return;\n\n const filePath = this.getOutputPath(context);\n const sourceFile = await this.directoryManager.createSourceFile(\n context.project,\n filePath,\n );\n\n const packageName = context.packageName;\n // Reducer-specific import logic\n const typeImportName = `${pascalCase(context.docModel.name)}${pascalCase(context.module.name)}Operations`;\n const typeImportPath = `${packageName}/document-models/${kebabCase(context.docModel.name)}`;\n\n // Import management (shared utility)\n this.importManager.replaceImportByName(\n sourceFile,\n typeImportName,\n typeImportPath,\n true,\n );\n\n // AST logic (specific to reducers)\n this.createReducerObject(sourceFile, typeImportName, context);\n\n // Detect and import error classes used in the actual reducer code (after generation)\n this.addErrorImports(sourceFile, context);\n\n await sourceFile.save();\n }\n\n private static getDefaultReducerCode(methodName: string): string[] {\n return [\n `// TODO: Implement \"${methodName}\" reducer`,\n `throw new Error('Reducer \"${methodName}\" not yet implemented');`,\n ];\n }\n\n private addErrorImports(\n sourceFile: SourceFile,\n context: GenerationContext,\n ): void {\n // Collect all errors from all operations\n const allErrors: OperationErrorSpecification[] = [];\n\n context.operations.forEach((operation) => {\n if (Array.isArray(operation.errors)) {\n operation.errors\n .filter((error) => error.name)\n .forEach((error) => {\n // Deduplicate errors by name\n if (!allErrors.find((e) => e.name === error.name)) {\n allErrors.push(error);\n }\n });\n }\n });\n\n if (allErrors.length === 0) return;\n\n // Analyze the actual source file content to find which errors are used\n const sourceFileContent = sourceFile.getFullText();\n const usedErrors = new Set<string>();\n\n allErrors.forEach((error) => {\n // Check if error class name is mentioned anywhere in the source file\n // Look for patterns like \"new ErrorName\" or \"throw ErrorName\" or \"ErrorName(\"\n const errorPattern = new RegExp(`\\\\b${error.name}\\\\b`, \"g\");\n if (errorPattern.test(sourceFileContent)) {\n usedErrors.add(error.name!);\n }\n });\n\n // Add imports for used errors (only if they're not already imported)\n if (usedErrors.size > 0) {\n const errorImportPath = `../../gen/${kebabCase(context.module.name)}/error.js`;\n const errorClassNames = Array.from(usedErrors);\n\n // Check if imports already exist to avoid duplicates\n const existingImports = sourceFile.getImportDeclarations();\n const existingErrorImport = existingImports.find(\n (importDecl) =>\n importDecl.getModuleSpecifierValue() === errorImportPath,\n );\n\n if (existingErrorImport) {\n // Get already imported error names\n const existingNamedImports = existingErrorImport\n .getNamedImports()\n .map((namedImport) => namedImport.getName());\n\n // Only import errors that aren't already imported\n const newErrorsToImport = errorClassNames.filter(\n (errorName) => !existingNamedImports.includes(errorName),\n );\n\n if (newErrorsToImport.length > 0) {\n // Add new named imports to existing import declaration\n existingErrorImport.addNamedImports(newErrorsToImport);\n }\n } else {\n // Create new import declaration\n this.importManager.addNamedImports(\n sourceFile,\n errorClassNames,\n errorImportPath,\n );\n }\n }\n }\n\n private getOutputPath(context: GenerationContext): string {\n return this.directoryManager.getReducerPath(\n context.rootDir,\n context.docModel.name,\n context.module.name,\n );\n }\n\n private createReducerObject(\n sourceFile: SourceFile,\n typeName: string,\n context: GenerationContext,\n ): void {\n const { operations, forceUpdate } = context;\n const operationHandlersObjectName = `${camelCase(context.docModel.name)}${pascalCase(context.module.name)}Operations`;\n const legacyReducerVar = sourceFile.getVariableDeclaration(\"reducer\");\n if (legacyReducerVar) {\n this.declarationManager.renameVariable(\n sourceFile,\n \"reducer\",\n operationHandlersObjectName,\n );\n }\n let reducerVar = sourceFile.getVariableDeclaration(\n operationHandlersObjectName,\n );\n if (!reducerVar) {\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: operationHandlersObjectName,\n type: typeName,\n initializer: \"{}\",\n },\n ],\n });\n reducerVar = sourceFile.getVariableDeclarationOrThrow(\n operationHandlersObjectName,\n );\n } else {\n // Ensure correct type\n const typeNode = reducerVar.getTypeNode();\n if (!typeNode || typeNode.getText() !== typeName) {\n reducerVar.setType(typeName);\n }\n }\n\n const initializer = reducerVar.getInitializerIfKindOrThrow(\n SyntaxKind.ObjectLiteralExpression,\n );\n\n for (const operation of operations) {\n this.addReducerMethod(initializer, operation, forceUpdate);\n }\n }\n\n private addReducerMethod(\n objectLiteral: ObjectLiteralExpression,\n operation: CodegenOperation,\n forceUpdate = false,\n ): void {\n const actionName = camelCase(operation.name ?? \"\");\n if (!actionName) return;\n\n const methodName = `${actionName}Operation`;\n\n const reducerCode = operation.reducer?.trim();\n\n const existingReducer = objectLiteral\n .getProperty(methodName)\n ?.asKind(SyntaxKind.MethodDeclaration);\n\n // if reducer already exists but forceUpdate is true, update it\n if (existingReducer) {\n if (forceUpdate && reducerCode) {\n existingReducer.setBodyText(\"\");\n this.setReducerMethodCode(existingReducer, reducerCode);\n }\n return;\n }\n\n // if reducer doesn't exist, create it and set the code with the default code if no code is provided\n const method = objectLiteral.addMethod({\n name: methodName,\n parameters: [{ name: \"state\" }, { name: \"action\" }],\n });\n this.setReducerMethodCode(method, reducerCode);\n }\n\n private setReducerMethodCode(reducer: MethodDeclaration, code?: string) {\n reducer.addStatements(\n code ? [code] : ReducerGenerator.getDefaultReducerCode(reducer.getName()),\n );\n }\n}\n","import type { SourceFile } from \"ts-morph\";\n\nexport class DeclarationManager {\n renameVariable(\n sourceFile: SourceFile,\n oldName: string,\n newName: string,\n ): void {\n const variable = sourceFile.getVariableDeclaration(oldName);\n\n if (variable) {\n variable.getNameNode().replaceWithText(newName);\n sourceFile.saveSync();\n }\n }\n}\n","import type { PHProjectDirectories } from \"@powerhousedao/codegen\";\nimport { kebabCase, pascalCase } from \"change-case\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport type { Project, SourceFile } from \"ts-morph\";\n\nexport class DirectoryManager {\n private directories: Required<PHProjectDirectories> = {\n documentModelDir: \"document-model\",\n editorsDir: \"editors\",\n processorsDir: \"processors\",\n subgraphsDir: \"subgraphs\",\n };\n\n constructor(directories: PHProjectDirectories = {}) {\n this.directories = {\n ...this.directories,\n ...directories,\n };\n }\n async ensureExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (err) {\n console.error(`Failed to create directory: ${dirPath}`, err);\n throw err;\n }\n }\n\n // Path builders for different file types\n getReducerPath(\n rootDir: string,\n docModelName: string,\n moduleName: string,\n ): string {\n return path.join(\n rootDir,\n this.directories.documentModelDir,\n kebabCase(docModelName),\n \"src\",\n \"reducers\",\n `${kebabCase(moduleName)}.ts`,\n );\n }\n\n getActionsPath(\n rootDir: string,\n docModelName: string,\n moduleName: string,\n ): string {\n return path.join(\n rootDir,\n this.directories.documentModelDir,\n kebabCase(docModelName),\n \"src\",\n \"actions\",\n `${kebabCase(moduleName)}.ts`,\n );\n }\n\n getComponentPath(\n rootDir: string,\n docModelName: string,\n componentName: string,\n ): string {\n return path.join(\n rootDir,\n this.directories.documentModelDir,\n kebabCase(docModelName),\n \"src\",\n \"components\",\n `${pascalCase(componentName)}.tsx`,\n );\n }\n\n getTypesPath(rootDir: string, docModelName: string): string {\n return path.join(\n rootDir,\n this.directories.documentModelDir,\n kebabCase(docModelName),\n \"src\",\n \"types.ts\",\n );\n }\n\n async createSourceFile(\n project: Project,\n filePath: string,\n ): Promise<SourceFile> {\n await this.ensureExists(path.dirname(filePath));\n return (\n project.addSourceFileAtPathIfExists(filePath) ??\n project.createSourceFile(filePath, \"\", { overwrite: false })\n );\n }\n}\n","import type { ImportDeclaration, SourceFile } from \"ts-morph\";\n\nexport interface ImportSpec {\n moduleSpecifier: string;\n namedImports?: string[];\n defaultImport?: string;\n isTypeOnly?: boolean;\n}\n\nexport class ImportManager {\n addImport(sourceFile: SourceFile, spec: ImportSpec): void {\n // Check if import already exists\n const existing = sourceFile.getImportDeclaration(\n (imp) => imp.getFullText() === spec.moduleSpecifier,\n );\n if (existing) {\n this.mergeImports(existing, spec);\n } else {\n sourceFile.addImportDeclaration(spec);\n }\n }\n\n addTypeImport(sourceFile: SourceFile, typeName: string, path: string): void {\n this.addImport(sourceFile, {\n moduleSpecifier: path,\n namedImports: [typeName],\n isTypeOnly: true,\n });\n }\n\n addNamedImports(\n sourceFile: SourceFile,\n imports: string[],\n path: string,\n ): void {\n this.addImport(sourceFile, {\n moduleSpecifier: path,\n namedImports: imports,\n });\n }\n\n private mergeImports(\n existingImport: ImportDeclaration,\n newSpec: ImportSpec,\n ): void {\n // Logic to merge named imports if they don't already exist\n if (newSpec.namedImports) {\n const existingNames = existingImport\n .getNamedImports()\n .map((ni) => ni.getName());\n const newNames = newSpec.namedImports.filter(\n (name) => !existingNames.includes(name),\n );\n\n if (newNames.length > 0) {\n existingImport.addNamedImports(newNames);\n }\n }\n }\n\n replaceImportByName(\n sourceFile: SourceFile,\n name: string,\n path: string,\n isTypeOnly = false,\n ): void {\n const existing = sourceFile\n .getImportDeclarations()\n .filter((imp) =>\n imp.getNamedImports().find((ni) => ni.getName() === name),\n );\n existing.forEach((imp) => imp.remove());\n sourceFile.addImportDeclaration({\n moduleSpecifier: path,\n namedImports: [name],\n isTypeOnly,\n });\n sourceFile.saveSync();\n }\n}\n","import type {\n DocumentModelGlobalState,\n ModuleSpecification,\n} from \"@powerhousedao/shared/document-model\";\nimport fs from \"fs/promises\";\nimport { Project } from \"ts-morph\";\nimport { DeclarationManager } from \"../utilities/DeclarationManager.js\";\nimport { DirectoryManager } from \"../utilities/DirectoryManager.js\";\nimport { ImportManager } from \"../utilities/ImportManager.js\";\nimport type { FileGenerator } from \"./FileGenerator.js\";\nimport type {\n CodeGeneratorOptions,\n CodegenOperation,\n GenerationContext,\n PHProjectDirectories,\n} from \"./GenerationContext.js\";\nimport { ReducerGenerator } from \"./ReducerGenerator.js\";\n\nexport class TSMorphCodeGenerator {\n private project = new Project();\n private generators = new Map<string, FileGenerator>();\n private directories: PHProjectDirectories = {\n documentModelDir: \"document-model\",\n editorsDir: \"editors\",\n processorsDir: \"processors\",\n subgraphsDir: \"subgraphs\",\n };\n private forceUpdate = false;\n\n constructor(\n private rootDir: string,\n private docModels: DocumentModelGlobalState[],\n private packageName: string,\n options: CodeGeneratorOptions = { directories: {}, forceUpdate: false },\n ) {\n this.directories = {\n ...this.directories,\n ...options.directories,\n };\n this.packageName = packageName;\n this.forceUpdate = options.forceUpdate ?? false;\n\n this.setupGenerators();\n }\n\n private setupGenerators(): void {\n const importManager = new ImportManager();\n const directoryManager = new DirectoryManager(this.directories);\n const declarationManager = new DeclarationManager();\n // Register all generators\n this.generators.set(\n \"reducers\",\n new ReducerGenerator(importManager, directoryManager, declarationManager),\n );\n }\n\n // Generate specific file types\n async generateReducers(): Promise<void> {\n await this.generateFileType(\"reducers\");\n }\n\n // Generate everything\n async generateAll(): Promise<void> {\n for (const [type] of this.generators) {\n await this.generateFileType(type);\n }\n }\n\n private async generateFileType(type: string): Promise<void> {\n const generator = this.generators.get(type);\n if (!generator) {\n throw new Error(`No generator registered for type: ${type}`);\n }\n\n await this.setupProject();\n\n for (const docModel of this.docModels) {\n const latestSpec =\n docModel.specifications[docModel.specifications.length - 1];\n\n for (const module of latestSpec.modules) {\n const context = this.createGenerationContext(\n docModel,\n module,\n this.forceUpdate,\n );\n\n await generator.generate(context);\n }\n }\n }\n\n private async setupProject(): Promise<void> {\n // Only load files from configured directories\n const sourcePaths: string[] = [];\n\n if (this.directories.documentModelDir) {\n const dirPath = `${this.rootDir}/${this.directories.documentModelDir}`;\n await this.ensureDirectoryExists(dirPath);\n sourcePaths.push(`${dirPath}/**/*.ts`);\n }\n if (this.directories.editorsDir) {\n const dirPath = `${this.rootDir}/${this.directories.editorsDir}`;\n await this.ensureDirectoryExists(dirPath);\n sourcePaths.push(`${dirPath}/**/*.ts`);\n }\n if (this.directories.processorsDir) {\n const dirPath = `${this.rootDir}/${this.directories.processorsDir}`;\n await this.ensureDirectoryExists(dirPath);\n sourcePaths.push(`${dirPath}/**/*.ts`);\n }\n if (this.directories.subgraphsDir) {\n const dirPath = `${this.rootDir}/${this.directories.subgraphsDir}`;\n await this.ensureDirectoryExists(dirPath);\n sourcePaths.push(`${dirPath}/**/*.ts`);\n }\n\n // Exclude node_modules from all paths\n sourcePaths.push(`!${this.rootDir}/**/node_modules/**`);\n\n if (sourcePaths.length > 0) {\n this.project.addSourceFilesAtPaths(sourcePaths);\n }\n }\n\n private createGenerationContext(\n docModel: DocumentModelGlobalState,\n module: ModuleSpecification,\n forceUpdate = false,\n ): GenerationContext {\n const operations: CodegenOperation[] = module.operations.map((op) => ({\n ...op,\n hasInput: op.schema !== null,\n scope: op.scope || \"global\",\n state: op.scope === \"global\" ? \"\" : op.scope,\n }));\n\n return {\n rootDir: this.rootDir,\n packageName: this.packageName,\n docModel,\n module,\n project: this.project,\n operations,\n forceUpdate,\n };\n }\n\n private async ensureDirectoryExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (err) {\n console.error(`Failed to create directory: ${dirPath}`, err);\n throw err;\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAQA,SAAgB,UAA6C,OAAa;AACxE,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAC7D;;AAGH,eAAsB,kBACpB,MACmC;CACnC,IAAI;AACJ,KAAI;AACF,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,oCAAoC;WAC3C,KAAK,SAAS,OAAO,IAAI,KAAK,SAAS,OAAO,CAEvD,kBADa,MAAM,iBAAiB,MAAM,qBAAqB,EAC1C,MAAM;WAClB,KAAK,SAAS,QAAQ,EAAE;GACjC,MAAM,OAAO,MAAM,SAAS,MAAM,QAAQ;GAC1C,MAAM,aAAa,KAAK,MAAM,KAAK;AACnC,OAAI,WAAW,WACb,iBAAgB,WAAW,MAAM;OAEjC,iBAAgB;QAGlB,OAAM,IAAI,MAAM,sDAAsD;AAExE,SAAO;UACA,OAAO;AACd,QAAO,MAA4B,SAAS,qCACxC,IAAI,MAAM,4BAA4B,GACtC;;;;;AC3BR,SAAS,sBAAsB,eAAgC;CAC7D,MAAM,UAAU,YAAY,eAAe,EAAE,eAAe,MAAM,CAAC;AACnE,MAAK,MAAM,SAAS,SAAS;AAC3B,MAAI,CAAC,MAAM,aAAa,CAAE;EAC1B,MAAM,MAAM,KAAK,eAAe,MAAM,KAAK;AAE3C,OAAK,MAAM,YAAY,CAAC,gBAAgB,WAAW,CACjD,KAAI;AAEF,OADiB,aAAa,KAAK,KAAK,SAAS,EAAE,QAAQ,CAC9C,SAAS,8BAA8B,CAAE,QAAO;UACvD;;AAKZ,QAAO;;AAGT,SAAgB,eAAe,YAA+B;CAC5D,MAAM,WAAsB,EAAE;CAC9B,MAAM,gBAAgB,KAAK,YAAY,aAAa;AAEpD,KADuB,SAAS,eAAe,EAAE,gBAAgB,OAAO,CAAC,EACrD,aAAa,IAAI,sBAAsB,cAAc,CACvE,UAAS,KAAK,qBAAqB;AAErC,QAAO;;AAOT,eAAsB,wBACpB,UACA,YACe;AACf,KAAI,SAAS,WAAW,EAAG;CAE3B,MAAM,cAAc,MAAM,YAAY;EAAE,KAAK;EAAY,WAAW;EAAO,CAAC;CAE5E,MAAM,aACJ,YAAY,mBAAmB,qBAC/B,YAAY,kBAAkB;AAChC,KAAI,CAAC,WACH,OAAM,IAAI,MACR,yHACD;CAGH,MAAM,mBAAmB,EACvB,GAAI,YAAY,oBAAoB,EAAE,EACvC;CACD,MAAM,kBAAkB,EACtB,GAAI,YAAY,mBAAmB,EAAE,EACtC;CAED,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,OAAO,qBAAqB;AAClC,OAAK,MAAM,OAAO,KAAK,eAAe;AACpC,OAAI,iBAAiB,SAAS,KAAA,GAAW;AACvC,qBAAiB,OAAO;AACxB,UAAM,KAAK,IAAI;;AAEjB,OAAI,gBAAgB,SAAS,KAAA,EAC3B,iBAAgB,OAAO;;EAG3B,MAAM,eAAe,KAAK;AAI1B,OAAK,MAAM,CAAC,KAAK,gBAAgB,OAAO,QAAQ,aAAa,EAAE;AAC7D,OAAI,iBAAiB,SAAS,KAAA,GAAW;AACvC,qBAAiB,OAAO,YAAY;AACpC,UAAM,KAAK,IAAI;;AAEjB,OAAI,gBAAgB,SAAS,KAAA,EAC3B,iBAAgB,OAAO,YAAY;;;AAKzC,KAAI,MAAM,WAAW,EAAG;AAOxB,OAAM,aAAa,YALH;EACd,GAAG;EACH,kBAAkB,UAAU,iBAAiB;EAC7C,iBAAiB,UAAU,gBAAgB;EAC5C,CACsC;AACvC,SAAQ,IAAI,gCAAgC,MAAM,KAAK,KAAK,GAAG;;;;ACtEjE,eAAsB,sBACpB,oBACA,SACA;AACA,OAAM,6BAA6B,oBAAoB,QAAQ;;AAIjE,eAAsB,0BAA0B,SAAkB;CAChE,MAAM,EAAE,WAAW,sBAAsB,qBACvC,SACA,kBACD;CACD,MAAM,wBAAwB,kBAAkB,SAAS;CACzD,MAAM,aAAa,kBAAkB,kBAAkB,CAAC,SAAS;CACjE,MAAM,0BAA0B,KAC9BA,cAAY,uBAAuB,EAAE,eAAe,MAAM,CAAC,EAC3D,IAAI,uBAAuB,EAC3B,OAAO,UAAU,CAClB;AAED,MAAK,MAAM,sBAAsB,wBAC/B,OAAM,sBAAsB,oBAAoB,QAAQ;AAG1D,OAAM,qBACJ,YACA,kBACA,wBAAwB,KAAK,MAAM,EAAE,GAAG,CACzC;;AAEH,eAAsB,iBAAiB,UAAkB,SAAkB;AAKzE,OAAM,sBAHqB,MAAM,kBAAkB,SAAS,EAGZ,QAAQ;;AAS1D,eAAsB,eACpB,MACA,SACA;CACA,MAAM,EACJ,YACA,eACA,UAAU,aACV,kBACE;AAEJ,KAAI,cAAc,SAAS,EACzB,OAAM,IAAI,MAAM,gDAAgD;CAGlE,MAAM,kBAAkB,cAAc;CACtC,MAAM,WAAW,eAAe,UAAU,WAAW;AAGrD,OAAM,8BAA8B;EAClC;EACA,WAJgB,iBAAiB,UAAU,WAAW;EAKtD;EACA;EACA;EACD,CAAC;;AAOJ,eAAsB,mBAAmB,SAAkB;CACzD,MAAM,EAAE,WAAW,eAAe,qBAAqB,SAAS,UAAU;CAC1E,MAAM,aAAa,WAAW,kBAAkB,CAAC,SAAS;CAG1D,MAAM,eAAe,KACnB,WAAW,gBAAgB,EAC3B,KAAK,QAAQ,IAAI,aAAa,CAAC,EAC/B,KAAK,YAAY,kBAAkB,SAAS,QAAQ,CAAC,EACrD,OAAO,SAAS,EAChB,QACG,EAAE,oBACD,CAAC,aAAa,6BAA6B,cAAc,CAC5D,CACF;AAED,MAAK,MAAM,eAAe,cAAc;EACtC,MAAM,EACJ,MAAM,YACN,IAAI,UACJ,SAAS,eACT,kBACE;AAEJ,QAAM,eACJ;GACE;GACA;GACA;GACA;GACD,EACD,QACD;;AAGH,OAAM,qBACJ,YACA,WACA,aAAa,KAAK,MAAM,EAAE,GAAG,CAC9B;;AAUH,eAAsB,YAAY,MAAuB,SAAkB;CACzE,MAAM,EACJ,SACA,OACA,sBACA,sBACA,eACE;AAEJ,OAAM,mBAAmB;EACvB;EACA,WAAW,cAAc,UAAU,QAAQ;EAC3C,YAAY;EACZ,UAAU,SAAS,UAAU,QAAQ;EACrC,yBAAyB,wBAAwB,EAAE;EACnD,sBAAsB,wBAAwB;EAC/C,CAAC;;AAOJ,eAAsB,gBAAgB,SAAkB;CACtD,MAAM,EAAE,WAAW,eAAe,qBAAqB,SAAS,UAAU;CAC1E,MAAM,aAAa,WAAW,kBAAkB,CAAC,SAAS;CAG1D,MAAM,YAAY,KAChB,WAAW,gBAAgB,EAC3B,KAAK,QAAQ,IAAI,aAAa,CAAC,EAC/B,KAAK,YAAY,eAAe,SAAS,QAAQ,CAAC,EAClD,OAAO,SAAS,CACjB;AAED,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,EACJ,MAAM,SACN,IAAI,OACJ,SAAS,YACT,sBACA,yBACE;AACJ,QAAM,YACJ;GACE;GACA;GACA;GACA;GACA;GACD,EACD,QACD;;AAGH,OAAM,qBACJ,YACA,QACA,UAAU,KAAK,MAAM,EAAE,GAAG,CAC3B;;AAEH,eAAsB,iBAAiB,cAAsB,SAAkB;AAC7E,OAAM,wBAAwB;EAAE;EAAc;EAAS,CAAC;;AAI1D,eAAsB,qBAAqB,SAAkB;CAC3D,MAAM,EAAE,WAAW,iBAAiB,qBAClC,SACA,YACD;CACD,MAAM,aAAa,aAAa,kBAAkB,CAAC,SAAS;CAE5D,MAAM,gBAAgB,KACpB,aAAa,gBAAgB,EAC7B,KAAK,QAAQ,IAAI,aAAa,CAAC,EAC/B,KAAK,YAAY,oBAAoB,SAAS,QAAQ,CAAC,EACvD,IAAI,KAAK,eAAe,CAAC,EACzB,OAAO,UAAU,EACjB,QAAQ,CACT;AACD,MAAK,MAAM,gBAAgB,cACzB,OAAM,iBAAiB,cAAc,QAAQ;AAG/C,OAAM,qBACJ,YACA,aACA,cAAc,KAAK,SAAS,UAAU,KAAK,CAAC,CAC7C;;AAGH,eAAsB,kBACpB,MAMA,SACA;AACA,QAAO,MAAM,yBAAyB;EACpC;EACA,GAAG;EACJ,CAAC;;AAIJ,eAAsB,sBAAsB,SAAkB;CAC5D,MAAM,EAAE,WAAW,kBAAkB,qBACnC,SACA,aACD;CACD,MAAM,aAAa,cAAc,kBAAkB,CAAC,SAAS;CAC7D,MAAM,uBAAuB,KAC3B,cAAc,gBAAgB,EAC9B,KAAK,QAAQ,IAAI,aAAa,CAAC,EAC/B,KAAK,YAAY,qBAAqB,SAAS,QAAQ,CAAC,CACzD;AAED,MAAK,MAAM,iBAAiB,qBAC1B,OAAM,kBAAkB,eAAe,QAAQ;AAGjD,OAAM,qBACJ,YACA,cACA,qBAAqB,KAAK,MAAM,UAAU,EAAE,cAAc,CAAC,CAC5D;;AAIH,eAAsB,YAAY,SAAkB;AAClD,OAAM,0BAA0B,QAAQ;AACxC,OAAM,mBAAmB,QAAQ;AACjC,OAAM,gBAAgB,QAAQ;AAC9B,OAAM,qBAAqB,QAAQ;AACnC,OAAM,sBAAsB,QAAQ;;;;ACtStC,SAAgB,oBAA4B;AACE,QAAA;;;;ACE9C,SAAS,qBAA6B;CAGpC,MAAM,QAFU,cAAc,OAAO,KAAK,IAAI,CAExB,QAAQ,MAAM,gBAAgB;AACpD,KAAI,MACF,MAAK,MAAM,YAAY,OAAO;EAE5B,MAAM,UAAUC,OADAA,OAAK,UAAU,gBAAgB,EACjB,aAAa;AAE3C,MAAI,WAAW,QAAQ,CACrB,QAAO;;AAKb,OAAM,IAAI,MAAM,0CAA0C;;AAQ5D,SAAS,WACP,SACA,MACA,KACe;AACf,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,QAAQ,MAAM,SAAS,MAAM;GACjC;GACA,OAAO;GACP,OAAO;GACR,CAAC;AAEF,QAAM,GAAG,UAAU,SAAS;AAC1B,OAAI,SAAS,EACX,UAAS;OAET,wBAAO,IAAI,MAAM,iCAAiC,OAAO,CAAC;IAE5D;AAEF,QAAM,GAAG,UAAU,UAAU;AAC3B,UAAO,MAAM;IACb;GACF;;AAGJ,eAAsB,iBAAiB,EACrC,eACA,cACW;CACX,MAAM,UAAU,cAAc,QAAQ,eAAe,eAAe;AAEpE,KAAI;AAGF,QAAM,WACJ,QACA;GAJoB,oBAAoB;GAIxB;GAAe;GAAa;GAAQ,EACpD,QAAQ,KAAK,CACd;AAED,UAAQ,IAAI,6BAA6B,UAAU;UAC5C,OAAO;AACd,UAAQ,MAAM,4BAA4B,MAAM;;;;;ACtBpD,MAAM,yBAAyB;AAG/B,eAAsB,yCACpB,cACA;AAMA,KAAI,EAJF,iBAAiB,YACjB,iBAAiB,aACjB,iBAAiB,OAEP,QAAO;CACnB,MAAM,oBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GACe,MAChB,QAAQ,IAAI,SAAS,SAAS,uBAChC,EAAE,SAAS,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powerhousedao/codegen",
3
- "version": "6.2.2-dev.77",
3
+ "version": "6.2.2-dev.78",
4
4
  "license": "AGPL-3.0-only",
5
5
  "private": false,
6
6
  "type": "module",
@@ -40,12 +40,12 @@
40
40
  "@graphql-codegen/cli": "6.1.1",
41
41
  "@graphql-codegen/typescript": "5.0.7",
42
42
  "@powerhousedao/document-engineering": "1.40.5",
43
- "@powerhousedao/shared": "6.2.2-dev.77",
43
+ "@powerhousedao/shared": "6.2.2-dev.78",
44
44
  "@types/node": "25.2.3",
45
45
  "arg": "^5.0.2",
46
46
  "chalk": "5.6.2",
47
47
  "change-case": "5.4.4",
48
- "document-model": "6.2.2-dev.77",
48
+ "document-model": "6.2.2-dev.78",
49
49
  "graphql-codegen-typescript-validation-schema": "0.18.1",
50
50
  "load-json-file": "^7.0.1",
51
51
  "npm-registry-fetch": "^19.1.1",