@volter/twin-standard 1.0.158 → 1.0.160

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +3 -2
  2. package/client-sdks/package.json +1 -0
  3. package/client-sdks/pnpm-lock.yaml +210 -0
  4. package/dist/client-sdks/package.json +1 -0
  5. package/dist/client-sdks/pnpm-lock.yaml +210 -0
  6. package/dist/src/assessment.d.ts +13 -3
  7. package/dist/src/assessment.js +10 -6
  8. package/dist/src/browser-assessment.js +16 -13
  9. package/dist/src/check-sources.js +2 -2
  10. package/dist/src/clients/harness.d.ts +25 -4
  11. package/dist/src/clients/harness.js +184 -22
  12. package/dist/src/clients/jira.js +11 -2
  13. package/dist/src/clients/resend.first-use.json +2 -2
  14. package/dist/src/clients/run.js +19 -14
  15. package/dist/src/conformance.d.ts +3 -4
  16. package/dist/src/conformance.js +396 -203
  17. package/dist/src/consumer.d.ts +22 -1
  18. package/dist/src/consumer.js +91 -26
  19. package/dist/src/create-pack.d.ts +1 -1
  20. package/dist/src/create-pack.js +13 -12
  21. package/dist/src/credential-issuer-import.d.ts +3 -0
  22. package/dist/src/credential-issuer-import.js +42 -0
  23. package/dist/src/derive.js +6 -3
  24. package/dist/src/gate.js +4 -0
  25. package/dist/src/index.d.ts +1 -1
  26. package/dist/src/index.js +1 -1
  27. package/dist/src/lanes.d.ts +2 -0
  28. package/dist/src/lanes.js +7 -0
  29. package/dist/src/pack-facts.d.ts +3 -0
  30. package/dist/src/pack-facts.js +36 -1
  31. package/dist/src/protocol-3.js +13 -8
  32. package/dist/src/spec-documents.d.ts +4 -0
  33. package/dist/src/spec-documents.js +110 -3
  34. package/dist/src/spec-ir-client.js +1 -1
  35. package/dist/src/spec-ir-commands.js +1 -1
  36. package/dist/src/spec-ir-lines.js +1 -1
  37. package/dist/src/spec-ir-proto.d.ts +1 -1
  38. package/dist/src/spec-patches.js +2 -2
  39. package/dist/src/tools/judge-brief.js +1 -2
  40. package/dist/src/tools/life-coverage-walk.js +38 -26
  41. package/dist/src/tools/life-coverage.js +2 -2
  42. package/dist/src/tools/packs-root.js +3 -3
  43. package/dist/src/tools/score-pack.js +7 -7
  44. package/dist/src/tools/vendor-examples.js +95 -85
  45. package/dist/src/verdict.js +1 -1
  46. package/dist/src/walk/behavior-journey.d.ts +22 -14
  47. package/dist/src/walk/behavior-journey.js +199 -133
  48. package/dist/src/walk/journey-kit.d.ts +5 -4
  49. package/dist/src/walk/journey-kit.js +6 -2
  50. package/dist/src/walk/replay.d.ts +23 -0
  51. package/dist/src/walk/replay.js +118 -0
  52. package/dist/src/walk/serve-pack.d.ts +2 -2
  53. package/dist/src/walk/serve-pack.js +44 -2
  54. package/dist/src/walk/shape.d.ts +26 -5
  55. package/dist/src/walk/shape.js +167 -57
  56. package/dist/src/walk/vendor-fetch.d.ts +7 -2
  57. package/dist/src/walk/vendor-fetch.js +13 -2
  58. package/dist/src/walk/walk-database.d.ts +9 -1
  59. package/dist/src/walk/walk-database.js +35 -13
  60. package/dist/src/walk/xml-view.d.ts +3 -2
  61. package/dist/src/walk/xml-view.js +5 -4
  62. package/package.json +6 -4
  63. package/src/assessment.ts +12 -8
  64. package/src/browser-assessment.ts +12 -5
  65. package/src/check-sources.ts +2 -2
  66. package/src/clients/harness.ts +142 -19
  67. package/src/clients/jira.ts +4 -2
  68. package/src/clients/resend.first-use.json +2 -2
  69. package/src/clients/run.ts +17 -15
  70. package/src/conformance.ts +317 -147
  71. package/src/consumer.ts +83 -21
  72. package/src/create-pack.ts +13 -12
  73. package/src/credential-issuer-import.ts +38 -0
  74. package/src/derive.ts +6 -4
  75. package/src/gate.ts +3 -0
  76. package/src/index.ts +1 -1
  77. package/src/lanes.ts +7 -0
  78. package/src/pack-facts.ts +25 -2
  79. package/src/protocol-3.ts +12 -8
  80. package/src/spec-documents.ts +92 -3
  81. package/src/spec-ir-client.ts +1 -1
  82. package/src/spec-ir-commands.ts +1 -1
  83. package/src/spec-ir-lines.ts +1 -1
  84. package/src/spec-ir-proto.ts +1 -1
  85. package/src/spec-patches.ts +2 -2
  86. package/src/tools/judge-brief.ts +1 -2
  87. package/src/tools/life-coverage-walk.ts +32 -22
  88. package/src/tools/life-coverage.ts +2 -2
  89. package/src/tools/packs-root.ts +3 -3
  90. package/src/tools/score-pack.ts +8 -8
  91. package/src/tools/vendor-examples.ts +92 -80
  92. package/src/verdict.ts +1 -1
  93. package/src/walk/behavior-journey.ts +158 -109
  94. package/src/walk/journey-kit.ts +9 -7
  95. package/src/walk/replay.ts +103 -0
  96. package/src/walk/serve-pack.ts +30 -5
  97. package/src/walk/shape.ts +157 -55
  98. package/src/walk/vendor-fetch.ts +16 -4
  99. package/src/walk/walk-database.ts +41 -15
  100. package/src/walk/xml-view.ts +5 -4
@@ -187,6 +187,9 @@ importers:
187
187
  '@vercel/sdk':
188
188
  specifier: 1.28.38
189
189
  version: 1.28.38
190
+ jira.js:
191
+ specifier: 5.4.0
192
+ version: 5.4.0(debug@4.4.3)
190
193
  resend:
191
194
  specifier: 6.6.0
192
195
  version: 6.6.0
@@ -1187,12 +1190,26 @@ packages:
1187
1190
  engines: {node: '>=0.4.0'}
1188
1191
  hasBin: true
1189
1192
 
1193
+ agent-base@6.0.2:
1194
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
1195
+ engines: {node: '>= 6.0.0'}
1196
+
1197
+ asynckit@0.4.0:
1198
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
1199
+
1200
+ axios@1.21.0:
1201
+ resolution: {integrity: sha512-YCzXMB53Q9PZBsh7yN7wtapit4WepwcHS2fP8QhGsBxSz5YtgYobV7GGlWlAJi+RxfU77GQTQi2DSLUma42EYA==}
1202
+
1190
1203
  balanced-match@1.0.2:
1191
1204
  resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
1192
1205
 
1193
1206
  brace-expansion@2.1.7:
1194
1207
  resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==}
1195
1208
 
1209
+ call-bind-apply-helpers@1.0.2:
1210
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
1211
+ engines: {node: '>= 0.4'}
1212
+
1196
1213
  chokidar@4.0.3:
1197
1214
  resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
1198
1215
  engines: {node: '>= 14.16.0'}
@@ -1203,6 +1220,10 @@ packages:
1203
1220
  cjs-module-lexer@2.2.1:
1204
1221
  resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==}
1205
1222
 
1223
+ combined-stream@1.0.8:
1224
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
1225
+ engines: {node: '>= 0.8'}
1226
+
1206
1227
  commander@12.1.0:
1207
1228
  resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
1208
1229
  engines: {node: '>=18'}
@@ -1216,10 +1237,22 @@ packages:
1216
1237
  supports-color:
1217
1238
  optional: true
1218
1239
 
1240
+ delayed-stream@1.0.0:
1241
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
1242
+ engines: {node: '>=0.4.0'}
1243
+
1219
1244
  dotenv@16.6.1:
1220
1245
  resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
1221
1246
  engines: {node: '>=12'}
1222
1247
 
1248
+ dunder-proto@1.0.1:
1249
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
1250
+ engines: {node: '>= 0.4'}
1251
+
1252
+ es-define-property@1.0.1:
1253
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
1254
+ engines: {node: '>= 0.4'}
1255
+
1223
1256
  es-errors@1.3.0:
1224
1257
  resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
1225
1258
  engines: {node: '>= 0.4'}
@@ -1227,6 +1260,14 @@ packages:
1227
1260
  es-module-lexer@3.0.2:
1228
1261
  resolution: {integrity: sha512-BuIB67FngDSyQ/dpQNOZybwdEBDUGJQvOqwWr4ha/ufYiqzuEwPkKO2zLhRAgay28tStRIHUeWmszZAJo3GCOg==}
1229
1262
 
1263
+ es-object-atoms@1.1.2:
1264
+ resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
1265
+ engines: {node: '>= 0.4'}
1266
+
1267
+ es-set-tostringtag@2.1.0:
1268
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
1269
+ engines: {node: '>= 0.4'}
1270
+
1230
1271
  es6-promise@4.2.8:
1231
1272
  resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==}
1232
1273
 
@@ -1247,20 +1288,57 @@ packages:
1247
1288
  fast-wrap-ansi@0.2.2:
1248
1289
  resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==}
1249
1290
 
1291
+ follow-redirects@1.16.2:
1292
+ resolution: {integrity: sha512-/kVP2U8z596Ia0gwFrwyIeo74ta5aVmSeU1FfAUMAmcEP5EP7zydmag3SLiN64NaRKef3lxsq7i/g7ltJQDGow==}
1293
+ engines: {node: '>=4.0'}
1294
+ peerDependencies:
1295
+ debug: '*'
1296
+ peerDependenciesMeta:
1297
+ debug:
1298
+ optional: true
1299
+
1300
+ form-data@4.0.6:
1301
+ resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==}
1302
+ engines: {node: '>= 6'}
1303
+
1250
1304
  forwarded-parse@2.1.2:
1251
1305
  resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==}
1252
1306
 
1253
1307
  function-bind@1.1.2:
1254
1308
  resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
1255
1309
 
1310
+ get-intrinsic@1.3.0:
1311
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
1312
+ engines: {node: '>= 0.4'}
1313
+
1314
+ get-proto@1.0.1:
1315
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
1316
+ engines: {node: '>= 0.4'}
1317
+
1318
+ gopd@1.2.0:
1319
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
1320
+ engines: {node: '>= 0.4'}
1321
+
1256
1322
  graphql@17.0.2:
1257
1323
  resolution: {integrity: sha512-FRWbddMxfkjiB7z+aQDWIR+E34xo9I8c9mtK2RPv8PmMzKRvrdsreHL/Ui/TmwHJfhHChEtsFPyMHKI+xuarQQ==}
1258
1324
  engines: {node: ^22.0.0 || ^24.0.0 || ^25.0.0 || >=26.0.0}
1259
1325
 
1326
+ has-symbols@1.1.0:
1327
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
1328
+ engines: {node: '>= 0.4'}
1329
+
1330
+ has-tostringtag@1.0.2:
1331
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
1332
+ engines: {node: '>= 0.4'}
1333
+
1260
1334
  hasown@2.0.4:
1261
1335
  resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
1262
1336
  engines: {node: '>= 0.4'}
1263
1337
 
1338
+ https-proxy-agent@5.0.1:
1339
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
1340
+ engines: {node: '>= 6'}
1341
+
1264
1342
  import-in-the-middle@1.15.0:
1265
1343
  resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==}
1266
1344
 
@@ -1275,6 +1353,22 @@ packages:
1275
1353
  resolution: {integrity: sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==}
1276
1354
  engines: {node: '>= 0.4'}
1277
1355
 
1356
+ jira.js@5.4.0:
1357
+ resolution: {integrity: sha512-W/ZumutCfEYPA8Zqf5CuokfHCvmm9OybLpv1Kt6W5usOrt8gfbtvczCARkIJOlWq1aOJ/tp1LuaZzUWlXto3Qw==}
1358
+ engines: {node: '>=20'}
1359
+
1360
+ math-intrinsics@1.1.0:
1361
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
1362
+ engines: {node: '>= 0.4'}
1363
+
1364
+ mime-db@1.52.0:
1365
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
1366
+ engines: {node: '>= 0.6'}
1367
+
1368
+ mime-types@2.1.35:
1369
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
1370
+ engines: {node: '>= 0.6'}
1371
+
1278
1372
  minimatch@9.0.9:
1279
1373
  resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
1280
1374
  engines: {node: '>=16 || 14 >=14.17'}
@@ -1318,6 +1412,10 @@ packages:
1318
1412
  resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
1319
1413
  engines: {node: '>=0.10.0'}
1320
1414
 
1415
+ proxy-from-env@2.1.0:
1416
+ resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==}
1417
+ engines: {node: '>=10'}
1418
+
1321
1419
  querystringify@2.2.0:
1322
1420
  resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
1323
1421
 
@@ -2615,12 +2713,35 @@ snapshots:
2615
2713
 
2616
2714
  acorn@8.18.0: {}
2617
2715
 
2716
+ agent-base@6.0.2:
2717
+ dependencies:
2718
+ debug: 4.4.3
2719
+ transitivePeerDependencies:
2720
+ - supports-color
2721
+
2722
+ asynckit@0.4.0: {}
2723
+
2724
+ axios@1.21.0(debug@4.4.3):
2725
+ dependencies:
2726
+ follow-redirects: 1.16.2(debug@4.4.3)
2727
+ form-data: 4.0.6
2728
+ https-proxy-agent: 5.0.1
2729
+ proxy-from-env: 2.1.0
2730
+ transitivePeerDependencies:
2731
+ - debug
2732
+ - supports-color
2733
+
2618
2734
  balanced-match@1.0.2: {}
2619
2735
 
2620
2736
  brace-expansion@2.1.7:
2621
2737
  dependencies:
2622
2738
  balanced-match: 1.0.2
2623
2739
 
2740
+ call-bind-apply-helpers@1.0.2:
2741
+ dependencies:
2742
+ es-errors: 1.3.0
2743
+ function-bind: 1.1.2
2744
+
2624
2745
  chokidar@4.0.3:
2625
2746
  dependencies:
2626
2747
  readdirp: 4.1.2
@@ -2629,18 +2750,43 @@ snapshots:
2629
2750
 
2630
2751
  cjs-module-lexer@2.2.1: {}
2631
2752
 
2753
+ combined-stream@1.0.8:
2754
+ dependencies:
2755
+ delayed-stream: 1.0.0
2756
+
2632
2757
  commander@12.1.0: {}
2633
2758
 
2634
2759
  debug@4.4.3:
2635
2760
  dependencies:
2636
2761
  ms: 2.1.3
2637
2762
 
2763
+ delayed-stream@1.0.0: {}
2764
+
2638
2765
  dotenv@16.6.1: {}
2639
2766
 
2767
+ dunder-proto@1.0.1:
2768
+ dependencies:
2769
+ call-bind-apply-helpers: 1.0.2
2770
+ es-errors: 1.3.0
2771
+ gopd: 1.2.0
2772
+
2773
+ es-define-property@1.0.1: {}
2774
+
2640
2775
  es-errors@1.3.0: {}
2641
2776
 
2642
2777
  es-module-lexer@3.0.2: {}
2643
2778
 
2779
+ es-object-atoms@1.1.2:
2780
+ dependencies:
2781
+ es-errors: 1.3.0
2782
+
2783
+ es-set-tostringtag@2.1.0:
2784
+ dependencies:
2785
+ es-errors: 1.3.0
2786
+ get-intrinsic: 1.3.0
2787
+ has-tostringtag: 1.0.2
2788
+ hasown: 2.0.4
2789
+
2644
2790
  es6-promise@4.2.8: {}
2645
2791
 
2646
2792
  esbuild@0.25.12:
@@ -2684,16 +2830,61 @@ snapshots:
2684
2830
  dependencies:
2685
2831
  fast-string-width: 3.0.2
2686
2832
 
2833
+ follow-redirects@1.16.2(debug@4.4.3):
2834
+ optionalDependencies:
2835
+ debug: 4.4.3
2836
+
2837
+ form-data@4.0.6:
2838
+ dependencies:
2839
+ asynckit: 0.4.0
2840
+ combined-stream: 1.0.8
2841
+ es-set-tostringtag: 2.1.0
2842
+ hasown: 2.0.4
2843
+ mime-types: 2.1.35
2844
+
2687
2845
  forwarded-parse@2.1.2: {}
2688
2846
 
2689
2847
  function-bind@1.1.2: {}
2690
2848
 
2849
+ get-intrinsic@1.3.0:
2850
+ dependencies:
2851
+ call-bind-apply-helpers: 1.0.2
2852
+ es-define-property: 1.0.1
2853
+ es-errors: 1.3.0
2854
+ es-object-atoms: 1.1.2
2855
+ function-bind: 1.1.2
2856
+ get-proto: 1.0.1
2857
+ gopd: 1.2.0
2858
+ has-symbols: 1.1.0
2859
+ hasown: 2.0.4
2860
+ math-intrinsics: 1.1.0
2861
+
2862
+ get-proto@1.0.1:
2863
+ dependencies:
2864
+ dunder-proto: 1.0.1
2865
+ es-object-atoms: 1.1.2
2866
+
2867
+ gopd@1.2.0: {}
2868
+
2691
2869
  graphql@17.0.2: {}
2692
2870
 
2871
+ has-symbols@1.1.0: {}
2872
+
2873
+ has-tostringtag@1.0.2:
2874
+ dependencies:
2875
+ has-symbols: 1.1.0
2876
+
2693
2877
  hasown@2.0.4:
2694
2878
  dependencies:
2695
2879
  function-bind: 1.1.2
2696
2880
 
2881
+ https-proxy-agent@5.0.1:
2882
+ dependencies:
2883
+ agent-base: 6.0.2
2884
+ debug: 4.4.3
2885
+ transitivePeerDependencies:
2886
+ - supports-color
2887
+
2697
2888
  import-in-the-middle@1.15.0:
2698
2889
  dependencies:
2699
2890
  acorn: 8.18.0
@@ -2718,6 +2909,23 @@ snapshots:
2718
2909
  dependencies:
2719
2910
  hasown: 2.0.4
2720
2911
 
2912
+ jira.js@5.4.0(debug@4.4.3):
2913
+ dependencies:
2914
+ axios: 1.21.0(debug@4.4.3)
2915
+ mime-types: 2.1.35
2916
+ zod: 4.6.7
2917
+ transitivePeerDependencies:
2918
+ - debug
2919
+ - supports-color
2920
+
2921
+ math-intrinsics@1.1.0: {}
2922
+
2923
+ mime-db@1.52.0: {}
2924
+
2925
+ mime-types@2.1.35:
2926
+ dependencies:
2927
+ mime-db: 1.52.0
2928
+
2721
2929
  minimatch@9.0.9:
2722
2930
  dependencies:
2723
2931
  brace-expansion: 2.1.7
@@ -2752,6 +2960,8 @@ snapshots:
2752
2960
  dependencies:
2753
2961
  xtend: 4.0.2
2754
2962
 
2963
+ proxy-from-env@2.1.0: {}
2964
+
2755
2965
  querystringify@2.2.0: {}
2756
2966
 
2757
2967
  readdirp@4.1.2: {}
@@ -23,6 +23,7 @@ export declare function assessPack(packDir: string, options?: AssessmentOptions)
23
23
  }[];
24
24
  replay: {
25
25
  equal: boolean;
26
+ diagnostics: string[];
26
27
  runs: number;
27
28
  firstSha256: string;
28
29
  secondSha256: string;
@@ -53,7 +54,7 @@ export declare function assessPack(packDir: string, options?: AssessmentOptions)
53
54
  };
54
55
  at: string;
55
56
  retentionNotApplicable?: string | undefined;
56
- measured: boolean;
57
+ measured: true;
57
58
  passed: boolean;
58
59
  scope: string;
59
60
  package: any;
@@ -74,6 +75,15 @@ export declare function assessPack(packDir: string, options?: AssessmentOptions)
74
75
  package: string;
75
76
  version: string;
76
77
  };
78
+ peers: {
79
+ package: string;
80
+ version: string;
81
+ }[];
82
+ sdks: {
83
+ package: string;
84
+ version: string;
85
+ entry: string;
86
+ }[];
77
87
  dependencyLockSha256: string;
78
88
  appLocal: boolean;
79
89
  };
@@ -103,8 +113,8 @@ export declare function assessPack(packDir: string, options?: AssessmentOptions)
103
113
  mode: string;
104
114
  };
105
115
  } | {
106
- measured: boolean;
107
- passed: boolean;
116
+ measured: false;
117
+ passed: false;
108
118
  failures: string[];
109
119
  };
110
120
  integrity?: string | undefined;
@@ -16,6 +16,7 @@ import { conformance } from "./conformance.js";
16
16
  import { inMemoryWorld, walk, withPinnedWorldDraws, usePacks } from "./walk/behavior-journey.js";
17
17
  import { compilePackFacts } from "./pack-facts.js";
18
18
  import { expandFills } from "./walk/journey-kit.js";
19
+ import { compareReplays } from "./walk/replay.js";
19
20
  import { runConsumerWorkflow } from "./consumer.js";
20
21
  const canonical = (value) => value && typeof value === 'object' ? Array.isArray(value) ? value.map(canonical) : Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => [key, canonical(item)])) : value;
21
22
  const json = (value) => JSON.stringify(canonical(value));
@@ -73,7 +74,8 @@ export async function assessPack(packDir, options = {}) {
73
74
  const coverageOf = (result) => !instrumented || result.ambiguous ? null : { total: declared.length, exercised: result.exercised.length, percent: 100 * result.exercised.length / declared.length, operations: result.exercised, missing: declared.filter((id) => !result.exercised.includes(id)) };
74
75
  async function replay(served) {
75
76
  const world = inMemoryWorld('catalog-replay');
76
- const failures = [], trace = [];
77
+ const failures = [];
78
+ const trace = [];
77
79
  const exercised = new Set();
78
80
  const signatures = new WeakMap();
79
81
  let ambiguous = false;
@@ -94,7 +96,7 @@ export async function assessPack(packDir, options = {}) {
94
96
  exercised.add(id);
95
97
  });
96
98
  try {
97
- await withPinnedWorldDraws(() => walk(structuredClone(life), world.root(), failures, { beats: true, ...(served ? { served } : {}), hooks: { after: (step, path, answer) => trace.push({ name: step.name ?? '', path, status: answer.status, body: answer.body }) } }));
99
+ await withPinnedWorldDraws(() => walk(structuredClone(life), world.root(), failures, { beats: true, ...(served ? { served } : {}), hooks: { after: (step, path, answer) => trace.push({ name: step.name ?? '', path, status: answer.status, body: answer.body, ...(answer.sql ? { sql: answer.sql } : {}), ...(answer.connection ? { connection: answer.connection } : {}) }) } }));
98
100
  return { failures, trace, exercised: [...exercised].sort(), ambiguous };
99
101
  }
100
102
  finally {
@@ -103,9 +105,10 @@ export async function assessPack(packDir, options = {}) {
103
105
  }
104
106
  }
105
107
  const first = await replay(), second = await replay();
106
- const replayEqual = first.trace.length > 0 && json(first.trace) === json(second.trace);
108
+ const comparison = compareReplays(first.trace, second.trace);
109
+ const replayEqual = comparison.equal;
107
110
  const coverage = coverageOf(first);
108
- const quick = { scope: 'packaged-customer-journey; in-process', steps: life.steps.length, answered: first.trace.length, failures: [...first.failures, ...second.failures], replay: { equal: replayEqual, runs: 2, firstSha256: hash(first.trace), secondSha256: hash(second.trace) }, operationCoverage: coverage, servedOperations, surface: owners ? { total: declared.length, served: servedOperations.length, gap: declared.length - servedOperations.length } : null, codeCoverage: null, stateTransitionCoverage: null };
111
+ const quick = { scope: 'packaged-customer-journey; in-process', steps: life.steps.length, answered: first.trace.length, failures: [...first.failures, ...second.failures], replay: { equal: replayEqual, diagnostics: comparison.diagnostics, runs: 2, firstSha256: hash(first.trace), secondSha256: hash(second.trace) }, operationCoverage: coverage, servedOperations, surface: owners ? { total: declared.length, served: servedOperations.length, gap: declared.length - servedOperations.length } : null, codeCoverage: null, stateTransitionCoverage: null };
109
112
  let browser = { measured: false, reason: options.browser ? 'Journey has a wire Chromium fetch cannot exercise' : 'Browser target not requested' };
110
113
  const httpOnly = life.steps.every((step) => 'method' in step || 'wait' in step);
111
114
  if (options.browser && httpOnly) {
@@ -113,13 +116,13 @@ export async function assessPack(packDir, options = {}) {
113
116
  const transport = await chromiumServed(packDir, life.host ?? 'twin.local', 'http-journey');
114
117
  try {
115
118
  const a = await replay(transport.served), b = await replay(transport.served);
116
- browser = { measured: true, target: 'HTTP customer journey replay through Chromium at each request origin; authored HTTP headers and observed wire responses', responseObservation: 'Transport observes status, headers and body, including redirects and Set-Cookie; these are not JavaScript-visible response claims', applicationOriginCorsCoverage: null, cookieJarCoverage: null, version: transport.version, answered: a.trace.length, failures: [...a.failures, ...b.failures], replay: { equal: a.trace.length > 0 && json(a.trace) === json(b.trace), firstSha256: hash(a.trace), secondSha256: hash(b.trace), runs: 2 }, operationCoverage: coverageOf(a), domCoverage: null, clock: transport.clock };
119
+ const compared = compareReplays(a.trace, b.trace);
120
+ browser = { measured: true, target: 'HTTP customer journey replay through Chromium at each request origin; authored HTTP headers and observed wire responses', responseObservation: 'Transport observes status, headers and body, including redirects and Set-Cookie; these are not JavaScript-visible response claims', applicationOriginCorsCoverage: null, cookieJarCoverage: null, version: transport.version, answered: a.trace.length, failures: [...a.failures, ...b.failures], replay: { equal: compared.equal, diagnostics: compared.diagnostics, firstSha256: hash(a.trace), secondSha256: hash(b.trace), runs: 2 }, operationCoverage: coverageOf(a), domCoverage: null, clock: transport.clock };
117
121
  }
118
122
  finally {
119
123
  await transport.stop();
120
124
  }
121
125
  }
122
- const conform = options.conformance === false ? null : await conformance(packDir);
123
126
  let consumer;
124
127
  try {
125
128
  consumer = options.consumer ? await runConsumerWorkflow(packDir, options.consumer) : { measured: false, passed: false, failures: ['Installed customer workflow was not prepared'] };
@@ -127,6 +130,7 @@ export async function assessPack(packDir, options = {}) {
127
130
  catch (error) {
128
131
  consumer = { measured: false, passed: false, failures: [error.message] };
129
132
  }
133
+ const conform = options.conformance === false ? null : await conformance(packDir, consumer.measured ? { consumer } : {});
130
134
  const ready = gates.length > 0 && gates.every((gate) => !gate.failures.length) && !quick.failures.length && replayEqual && conform !== null && conform.length > 0 && conform.every((result) => !result.failures.length) && consumer.measured && consumer.passed && (!options.browser || !httpOnly || browser.measured === true && browser.failures.length === 0 && browser.replay.equal);
131
135
  // the artifact assessed, by the integrity its prepared consumer verified the installed candidate against (consumer.ts)
132
136
  return { schemaVersion: 1, vendor, package: manifest.name, version: manifest.version, ...(consumer.integrity ? { integrity: consumer.integrity } : {}), ready, gates: gates.map((gate) => ({ ...gate, unit: gate.unit === packDir ? vendor : `${vendor}/${gate.unit.slice(packDir.length + 1)}` })), quick, browser, conformance: conform, consumer };
@@ -1,20 +1,12 @@
1
- var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
- if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
- return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
- return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
- });
6
- }
7
- return path;
8
- };
9
1
  // Browser transport for the existing journey engine. A container supplies network isolation in catalog execution.
10
2
  import { join } from 'node:path';
11
3
  import { existsSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
12
4
  import { tmpdir } from 'node:os';
13
5
  import { worldNow } from '@volter/world-core/runtime';
6
+ import { packFetch } from "./walk/vendor-fetch.js";
14
7
  export async function chromiumServed(packDir, host, mode = 'browser-fetch') {
15
8
  const { chromium } = await import('playwright');
16
- const mod = await import(__rewriteRelativeImportExtension(join(packDir, 'src/index.ts')));
17
- const factory = Object.entries(mod).find(([name, value]) => /^create\w+Fetch$/.test(name) && !/TwinFetch$/.test(name) && typeof value === 'function')?.[1];
9
+ const factory = await packFetch(packDir);
18
10
  if (!factory)
19
11
  throw new Error('Browser assessment needs the pack HTTP fetch factory');
20
12
  const library = ['/usr/lib/x86_64-linux-gnu/faketime/libfaketimeMT.so.1', '/usr/lib/aarch64-linux-gnu/faketime/libfaketimeMT.so.1'].find(existsSync);
@@ -41,7 +33,7 @@ export async function chromiumServed(packDir, host, mode = 'browser-fetch') {
41
33
  }
42
34
  const served = async (root, options) => {
43
35
  syncClock();
44
- const fetchPack = factory({ root, ...options });
36
+ const fetchPack = factory(root, options);
45
37
  const context = await browser.newContext({ serviceWorkers: 'block', locale: 'en-US', timezoneId: 'UTC' });
46
38
  const pages = [];
47
39
  const pending = new Map();
@@ -96,7 +88,7 @@ export async function chromiumServed(packDir, host, mode = 'browser-fetch') {
96
88
  };
97
89
  return {
98
90
  scheme: 'https',
99
- fetch: async (request, options) => {
91
+ fetch: Object.assign(async (request, options) => {
100
92
  const entry = await acquire(mode === 'http-journey' ? new URL(request.url).origin : `https://${host}`);
101
93
  const { page } = entry;
102
94
  const observation = { request };
@@ -128,8 +120,19 @@ export async function chromiumServed(packDir, host, mode = 'browser-fetch') {
128
120
  pending.delete(page);
129
121
  entry.busy = false;
130
122
  }
123
+ }, {
124
+ managedDatabaseUrl: fetchPack.managedDatabaseUrl,
125
+ managedDatabaseClock: fetchPack.managedDatabaseClock,
126
+ managedDatabaseConnection: fetchPack.managedDatabaseConnection,
127
+ }),
128
+ stop: async () => {
129
+ try {
130
+ await context.close();
131
+ }
132
+ finally {
133
+ await fetchPack.stopDatabase?.();
134
+ }
131
135
  },
132
- stop: () => context.close(),
133
136
  };
134
137
  };
135
138
  return { served, version: browser.version(), clock: { native: 'World time through libfaketime', nativePrecisionMs: 1000, javascriptPrecisionMs: 1, monotonic: 'elapsed machine time' }, stop: async () => { try {
@@ -10,13 +10,13 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
10
10
  // check-sources — the evidence a derived pack cites, fetched (docs/contributing/architecture.md,
11
11
  // "Protocol 3", Correcting the spec and The semantics layer). Every URL a state transition's `source`,
12
12
  // a handler's `// source:` line or a spec patch's `why` names is fetched once and its answer recorded in `spec/sources.json`; a patch's
13
- // `quote` is looked for in the text of the page its `source` names. derive-pack reads the record offline
13
+ // `quote` is looked for in the text of the page its `source` names. the derivation reads the record offline
14
14
  // and refuses a dead source, one never checked, and a quote its page does not hold.
15
15
  //
16
16
  // Documentation pages, never a vendor's API: each is fetched at most once per run, sixteen at a time,
17
17
  // and a page already recorded as found is not fetched again (--recheck fetches everything).
18
18
  //
19
- // Usage: twin-standard check-sources <pack dir> [--recheck] (twin-world: bun scripts/check-sources.ts <vendor>)
19
+ // Usage: twin-standard check-sources <pack dir> [--recheck]
20
20
  import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
21
21
  import { dirname, join } from 'node:path';
22
22
  import { unitAt } from "./unit.js";
@@ -30,10 +30,31 @@ export type ClientCase = {
30
30
  /** The World's proxy in front of a pack served on `served`: it ends the caller's TLS (here, none was begun) and forwards
31
31
  * each request and socket upgrade to the pack with `x-forwarded-proto: https`, the vendor's Host unchanged, as a World's
32
32
  * proxy forwards a caller of the vendor's https host (twin-fetch.ts, twinPublicBase: the links and socket URLs the pack
33
- * answers are then the vendor's secure ones). Answers the proxy's port. */
34
- export declare function worldProxy(served: number): Promise<number>;
35
- /** HTTP to a served pack, with the vendor Host and manual redirects. Each call owns a fresh connection;
36
- * its caller's abort signal retires that request, including an unfinished response body. */
33
+ * answers are then the vendor's secure ones). Its stop settles every connection it opened. */
34
+ export declare function worldProxy(served: number, observe?: (request: {
35
+ url: string;
36
+ headers: Headers;
37
+ }, answer: {
38
+ status: number;
39
+ }) => void): Promise<{
40
+ port: number;
41
+ stop: () => Promise<void>;
42
+ }>;
43
+ /** A served socket either opens within its five-second handshake or closes under the same owner. */
44
+ export declare function openWebSocket(socket: WebSocket): Promise<boolean>;
45
+ /** One request and its complete body share the check's ten-second lifetime, including caller cancellation. */
46
+ export declare function readHttpResponse(fetcher: (request: Request) => Promise<Response>, request: Request): Promise<{
47
+ status: number;
48
+ headers: Record<string, string>;
49
+ text: string;
50
+ bodyBytes: Uint8Array;
51
+ bodyError?: {
52
+ message: string;
53
+ cancelled: boolean;
54
+ };
55
+ }>;
56
+ /** HTTP to a served pack, with the vendor Host and manual redirects. Headers resolve before the streamed body;
57
+ * its caller's abort signal owns the fresh connection until the body ends or is cancelled. */
37
58
  export declare function servedHttpFetch(port: number): typeof fetch;
38
59
  /** The context for a pack reached at `port` of this machine (the World's proxy in front of it). */
39
60
  /** `raw`: a raw protocol's served port (SMTP's listener), which a connection reaches directly, as a World passes a raw TCP